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.

Files changed (637) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +2654 -953
  3. data/etc/roots.pem +282 -683
  4. data/include/grpc/compression.h +9 -26
  5. data/include/grpc/grpc.h +10 -24
  6. data/include/grpc/grpc_security.h +7 -1
  7. data/include/grpc/impl/codegen/compression_types.h +5 -62
  8. data/include/grpc/impl/codegen/grpc_types.h +10 -6
  9. data/include/grpc/module.modulemap +1 -10
  10. data/include/grpc/support/alloc.h +3 -2
  11. data/include/grpc/support/log.h +1 -2
  12. data/{src/core/lib/gpr/thd_internal.h → include/grpc/support/thd_id.h} +23 -9
  13. data/src/boringssl/err_data.c +550 -496
  14. data/src/core/ext/census/grpc_context.cc +2 -1
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +5 -4
  16. data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -7
  17. data/src/core/ext/filters/client_channel/client_channel.cc +162 -172
  18. data/src/core/ext/filters/client_channel/client_channel_factory.cc +4 -2
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +10 -10
  20. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +18 -14
  21. data/src/core/ext/filters/client_channel/http_proxy.cc +3 -1
  22. data/src/core/ext/filters/client_channel/lb_policy.cc +21 -105
  23. data/src/core/ext/filters/client_channel/lb_policy.h +166 -170
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +41 -36
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1452 -1459
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +3 -2
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +7 -8
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +27 -27
  30. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +279 -304
  31. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +358 -330
  32. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +30 -41
  33. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +7 -14
  34. data/src/core/ext/filters/client_channel/lb_policy_factory.cc +8 -21
  35. data/src/core/ext/filters/client_channel/lb_policy_factory.h +23 -27
  36. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +58 -33
  37. data/src/core/ext/filters/client_channel/lb_policy_registry.h +25 -12
  38. data/src/core/ext/filters/client_channel/parse_address.cc +10 -8
  39. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -2
  40. data/src/core/ext/filters/client_channel/resolver.cc +6 -52
  41. data/src/core/ext/filters/client_channel/resolver.h +98 -55
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +266 -237
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +5 -5
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +31 -27
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +244 -207
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +161 -148
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +47 -31
  48. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +126 -126
  49. data/src/core/ext/filters/client_channel/resolver_factory.h +33 -32
  50. data/src/core/ext/filters/client_channel/resolver_registry.cc +110 -90
  51. data/src/core/ext/filters/client_channel/resolver_registry.h +49 -36
  52. data/src/core/ext/filters/client_channel/retry_throttle.cc +29 -22
  53. data/src/core/ext/filters/client_channel/subchannel.cc +173 -173
  54. data/src/core/ext/filters/client_channel/subchannel.h +38 -45
  55. data/src/core/ext/filters/client_channel/subchannel_index.cc +44 -40
  56. data/src/core/ext/filters/client_channel/uri_parser.cc +3 -3
  57. data/src/core/ext/filters/deadline/deadline_filter.cc +27 -18
  58. data/src/core/ext/filters/http/client/http_client_filter.cc +26 -23
  59. data/src/core/ext/filters/http/http_filters_plugin.cc +3 -2
  60. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +78 -110
  61. data/src/core/ext/filters/http/server/http_server_filter.cc +29 -26
  62. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +9 -11
  63. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +2 -1
  64. data/src/core/ext/filters/max_age/max_age_filter.cc +14 -14
  65. data/src/core/ext/filters/message_size/message_size_filter.cc +20 -18
  66. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -4
  67. data/src/core/ext/filters/workarounds/workaround_utils.cc +4 -4
  68. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -1
  69. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -10
  70. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +4 -4
  71. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +11 -12
  72. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +16 -13
  73. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +36 -9
  74. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +3 -0
  75. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +17 -14
  76. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +139 -145
  77. data/src/core/ext/transport/chttp2/transport/flow_control.cc +16 -14
  78. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -7
  79. data/src/core/ext/transport/chttp2/transport/frame_data.cc +35 -33
  80. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +27 -25
  81. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +12 -12
  82. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +16 -15
  83. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +19 -19
  84. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +11 -11
  85. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +23 -22
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +35 -35
  87. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +10 -7
  88. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +2 -2
  89. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  90. data/src/core/ext/transport/chttp2/transport/internal.h +1 -1
  91. data/src/core/ext/transport/chttp2/transport/parsing.cc +35 -39
  92. data/src/core/ext/transport/chttp2/transport/stream_map.cc +8 -7
  93. data/src/core/ext/transport/chttp2/transport/varint.cc +5 -5
  94. data/src/core/ext/transport/chttp2/transport/writing.cc +18 -18
  95. data/src/core/ext/transport/inproc/inproc_transport.cc +43 -23
  96. data/src/core/lib/{gpr → avl}/avl.cc +61 -57
  97. data/{include/grpc/support → src/core/lib/avl}/avl.h +25 -35
  98. data/src/core/lib/backoff/backoff.cc +6 -5
  99. data/src/core/lib/channel/channel_args.cc +23 -109
  100. data/src/core/lib/channel/channel_args.h +5 -31
  101. data/src/core/lib/channel/channel_stack.cc +11 -8
  102. data/src/core/lib/channel/channel_stack_builder.cc +10 -7
  103. data/src/core/lib/channel/connected_channel.cc +18 -17
  104. data/src/core/lib/channel/handshaker.cc +8 -8
  105. data/src/core/lib/channel/handshaker_registry.cc +3 -2
  106. data/src/core/lib/compression/algorithm_metadata.h +13 -6
  107. data/src/core/lib/compression/compression.cc +72 -183
  108. data/src/core/lib/compression/compression_internal.cc +274 -0
  109. data/src/core/lib/compression/compression_internal.h +86 -0
  110. data/src/core/lib/compression/message_compress.cc +15 -15
  111. data/src/core/lib/compression/message_compress.h +4 -3
  112. data/src/core/lib/compression/stream_compression_gzip.cc +8 -8
  113. data/src/core/lib/compression/stream_compression_identity.cc +1 -1
  114. data/src/core/lib/debug/stats.cc +10 -8
  115. data/src/core/lib/debug/stats_data.cc +2 -1
  116. data/src/core/lib/debug/trace.cc +3 -3
  117. data/src/core/lib/gpr/alloc.cc +7 -11
  118. data/src/core/lib/gpr/arena.cc +34 -12
  119. data/src/core/lib/gpr/atm.cc +2 -1
  120. data/src/core/lib/gpr/cpu_linux.cc +3 -3
  121. data/src/core/lib/gpr/cpu_posix.cc +2 -1
  122. data/src/core/lib/gpr/env.h +1 -1
  123. data/src/core/lib/gpr/env_linux.cc +1 -1
  124. data/src/core/lib/gpr/env_windows.cc +4 -4
  125. data/src/core/lib/gpr/fork.cc +16 -2
  126. data/src/core/lib/gpr/host_port.cc +5 -4
  127. data/{include/grpc/support → src/core/lib/gpr}/host_port.h +5 -13
  128. data/src/core/lib/gpr/log.cc +5 -4
  129. data/src/core/lib/gpr/log_linux.cc +1 -1
  130. data/src/core/lib/gpr/mpscq.cc +1 -0
  131. data/src/core/lib/gpr/murmur_hash.cc +4 -4
  132. data/src/core/lib/gpr/string.cc +19 -16
  133. data/src/core/lib/gpr/string_posix.cc +3 -3
  134. data/src/core/lib/gpr/sync_posix.cc +5 -9
  135. data/src/core/lib/gpr/thd.cc +3 -3
  136. data/{include/grpc/support → src/core/lib/gpr}/thd.h +20 -28
  137. data/src/core/lib/gpr/thd_posix.cc +6 -4
  138. data/src/core/lib/gpr/thd_windows.cc +3 -1
  139. data/src/core/lib/gpr/time.cc +6 -4
  140. data/src/core/lib/gpr/time_posix.cc +2 -2
  141. data/{include/grpc/support → src/core/lib/gpr}/tls.h +6 -6
  142. data/{include/grpc/support → src/core/lib/gpr}/tls_gcc.h +3 -3
  143. data/{include/grpc/support → src/core/lib/gpr}/tls_msvc.h +3 -3
  144. data/src/core/lib/gpr/tls_pthread.cc +1 -1
  145. data/{include/grpc/support → src/core/lib/gpr}/tls_pthread.h +3 -3
  146. data/{include/grpc/support → src/core/lib/gpr}/useful.h +3 -3
  147. data/src/core/lib/{gpr++ → gprpp}/abstract.h +3 -3
  148. data/src/core/lib/{gpr++ → gprpp}/atomic.h +5 -5
  149. data/src/core/lib/{gpr++ → gprpp}/atomic_with_atm.h +3 -3
  150. data/src/core/lib/{gpr++ → gprpp}/atomic_with_std.h +3 -3
  151. data/src/core/lib/{gpr++ → gprpp}/debug_location.h +3 -3
  152. data/src/core/lib/{gpr++ → gprpp}/inlined_vector.h +44 -22
  153. data/src/core/lib/{gpr++ → gprpp}/manual_constructor.h +2 -2
  154. data/src/core/lib/{gpr++ → gprpp}/memory.h +14 -5
  155. data/src/core/lib/{gpr++ → gprpp}/orphanable.h +39 -14
  156. data/src/core/lib/{gpr++ → gprpp}/ref_counted.h +42 -10
  157. data/src/core/lib/{gpr++ → gprpp}/ref_counted_ptr.h +18 -8
  158. data/src/core/lib/http/format_request.cc +3 -3
  159. data/src/core/lib/http/httpcli.cc +6 -7
  160. data/src/core/lib/http/httpcli_security_connector.cc +10 -10
  161. data/src/core/lib/http/parser.cc +16 -12
  162. data/src/core/lib/iomgr/call_combiner.cc +12 -13
  163. data/src/core/lib/iomgr/closure.h +4 -6
  164. data/src/core/lib/iomgr/combiner.cc +10 -21
  165. data/src/core/lib/iomgr/error.cc +50 -55
  166. data/src/core/lib/iomgr/ev_epoll1_linux.cc +41 -52
  167. data/src/core/lib/iomgr/ev_epollex_linux.cc +80 -28
  168. data/src/core/lib/iomgr/ev_epollsig_linux.cc +23 -30
  169. data/src/core/lib/iomgr/ev_poll_posix.cc +52 -46
  170. data/src/core/lib/iomgr/ev_posix.cc +47 -6
  171. data/src/core/lib/iomgr/exec_ctx.cc +10 -10
  172. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  173. data/src/core/lib/iomgr/executor.cc +16 -13
  174. data/src/core/lib/iomgr/fork_posix.cc +1 -3
  175. data/src/core/lib/iomgr/gethostname_host_name_max.cc +1 -1
  176. data/src/core/lib/iomgr/iocp_windows.cc +1 -2
  177. data/src/core/lib/iomgr/iomgr.cc +2 -2
  178. data/src/core/lib/iomgr/iomgr_uv.cc +2 -0
  179. data/src/core/lib/iomgr/iomgr_uv.h +1 -1
  180. data/src/core/lib/iomgr/is_epollexclusive_available.cc +5 -4
  181. data/src/core/lib/iomgr/load_file.cc +3 -3
  182. data/src/core/lib/iomgr/pollset_windows.cc +1 -1
  183. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -9
  184. data/src/core/lib/iomgr/resolve_address_uv.cc +2 -2
  185. data/src/core/lib/iomgr/resolve_address_windows.cc +3 -2
  186. data/src/core/lib/iomgr/resource_quota.cc +36 -34
  187. data/src/core/lib/iomgr/sockaddr_utils.cc +39 -23
  188. data/src/core/lib/iomgr/socket_factory_posix.cc +5 -5
  189. data/src/core/lib/iomgr/socket_mutator.cc +7 -7
  190. data/src/core/lib/iomgr/socket_utils_common_posix.cc +7 -4
  191. data/src/core/lib/iomgr/socket_utils_linux.cc +3 -2
  192. data/src/core/lib/iomgr/tcp_client_posix.cc +7 -6
  193. data/src/core/lib/iomgr/tcp_client_windows.cc +0 -1
  194. data/src/core/lib/iomgr/tcp_posix.cc +47 -55
  195. data/src/core/lib/iomgr/tcp_server_posix.cc +12 -10
  196. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -5
  197. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -3
  198. data/src/core/lib/iomgr/tcp_windows.cc +1 -1
  199. data/src/core/lib/iomgr/timer_generic.cc +16 -14
  200. data/src/core/lib/iomgr/timer_heap.cc +8 -7
  201. data/src/core/lib/iomgr/timer_manager.cc +4 -3
  202. data/src/core/lib/iomgr/udp_server.cc +24 -16
  203. data/src/core/lib/iomgr/unix_sockets_posix.cc +15 -10
  204. data/src/core/lib/iomgr/wakeup_fd_cv.cc +6 -5
  205. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +1 -2
  206. data/src/core/lib/json/json.cc +1 -1
  207. data/src/core/lib/json/json_reader.cc +8 -6
  208. data/src/core/lib/json/json_string.cc +19 -18
  209. data/src/core/lib/json/json_writer.cc +10 -8
  210. data/src/core/lib/profiling/basic_timers.cc +1 -1
  211. data/src/core/lib/profiling/timers.h +3 -20
  212. data/src/core/lib/security/context/security_context.cc +16 -14
  213. data/src/core/lib/security/credentials/composite/composite_credentials.cc +17 -14
  214. data/src/core/lib/security/credentials/credentials.cc +9 -8
  215. data/src/core/lib/security/credentials/credentials.h +1 -1
  216. data/src/core/lib/security/credentials/credentials_metadata.cc +2 -2
  217. data/src/core/lib/security/credentials/fake/fake_credentials.cc +12 -13
  218. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +7 -4
  219. data/src/core/lib/security/credentials/iam/iam_credentials.cc +5 -3
  220. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -3
  221. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -7
  222. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +21 -18
  223. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +23 -18
  224. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +11 -7
  225. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +22 -21
  226. data/src/core/lib/security/{transport → security_connector}/security_connector.cc +46 -43
  227. data/src/core/lib/security/{transport → security_connector}/security_connector.h +3 -3
  228. data/src/core/lib/security/transport/client_auth_filter.cc +32 -34
  229. data/src/core/lib/security/transport/lb_targets_info.cc +7 -5
  230. data/src/core/lib/security/transport/secure_endpoint.cc +21 -21
  231. data/src/core/lib/security/transport/security_handshaker.cc +19 -18
  232. data/src/core/lib/security/transport/security_handshaker.h +1 -1
  233. data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
  234. data/src/core/lib/slice/b64.cc +19 -16
  235. data/src/core/lib/slice/percent_encoding.cc +5 -5
  236. data/src/core/lib/slice/slice.cc +35 -33
  237. data/src/core/lib/slice/slice_buffer.cc +16 -14
  238. data/src/core/lib/slice/slice_hash_table.cc +3 -2
  239. data/src/core/lib/slice/slice_intern.cc +21 -25
  240. data/src/core/lib/slice/slice_string_helpers.cc +45 -9
  241. data/src/core/lib/slice/slice_string_helpers.h +6 -0
  242. data/src/core/lib/surface/byte_buffer.cc +2 -2
  243. data/src/core/lib/surface/byte_buffer_reader.cc +6 -3
  244. data/src/core/lib/surface/call.cc +171 -260
  245. data/src/core/lib/surface/call_test_only.h +1 -13
  246. data/src/core/lib/surface/channel.cc +20 -43
  247. data/src/core/lib/surface/channel_init.cc +7 -7
  248. data/src/core/lib/surface/channel_ping.cc +2 -2
  249. data/src/core/lib/surface/completion_queue.cc +69 -75
  250. data/src/core/lib/surface/init.cc +4 -5
  251. data/src/core/lib/surface/init_secure.cc +1 -1
  252. data/src/core/lib/surface/lame_client.cc +1 -1
  253. data/src/core/lib/surface/server.cc +64 -59
  254. data/src/core/lib/surface/version.cc +2 -2
  255. data/src/core/lib/transport/bdp_estimator.cc +6 -5
  256. data/src/core/lib/transport/byte_stream.cc +23 -14
  257. data/src/core/lib/transport/byte_stream.h +1 -1
  258. data/src/core/lib/transport/connectivity_state.cc +9 -13
  259. data/src/core/lib/transport/error_utils.cc +10 -7
  260. data/src/core/lib/transport/metadata.cc +27 -26
  261. data/src/core/lib/transport/metadata.h +1 -1
  262. data/src/core/lib/transport/pid_controller.cc +2 -1
  263. data/src/core/lib/transport/service_config.cc +5 -5
  264. data/src/core/lib/transport/static_metadata.cc +225 -222
  265. data/src/core/lib/transport/static_metadata.h +77 -76
  266. data/src/core/lib/transport/timeout_encoding.cc +3 -2
  267. data/src/core/lib/transport/transport.cc +6 -5
  268. data/src/core/lib/transport/transport_op_string.cc +0 -1
  269. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -4
  270. data/src/core/tsi/alts_transport_security.cc +61 -0
  271. data/src/core/tsi/{gts_transport_security.h → alts_transport_security.h} +16 -8
  272. data/src/core/tsi/fake_transport_security.cc +59 -43
  273. data/src/core/tsi/ssl_transport_security.cc +122 -107
  274. data/src/core/tsi/transport_security.cc +3 -3
  275. data/src/core/tsi/transport_security_adapter.cc +16 -10
  276. data/src/ruby/bin/apis/pubsub_demo.rb +1 -1
  277. data/src/ruby/ext/grpc/rb_channel.c +3 -4
  278. data/src/ruby/ext/grpc/rb_compression_options.c +13 -3
  279. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -76
  280. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +8 -120
  281. data/src/ruby/ext/grpc/rb_server.c +52 -28
  282. data/src/ruby/lib/grpc/generic/rpc_server.rb +7 -4
  283. data/src/ruby/lib/grpc/version.rb +1 -1
  284. data/src/ruby/pb/test/client.rb +1 -1
  285. data/src/ruby/pb/test/server.rb +1 -1
  286. data/src/ruby/spec/client_server_spec.rb +4 -2
  287. data/src/ruby/spec/generic/active_call_spec.rb +2 -1
  288. data/src/ruby/spec/generic/client_stub_spec.rb +32 -8
  289. data/src/ruby/spec/server_spec.rb +26 -7
  290. data/third_party/boringssl/crypto/asn1/a_bitstr.c +7 -2
  291. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +15 -0
  292. data/third_party/boringssl/crypto/asn1/a_gentm.c +1 -1
  293. data/third_party/boringssl/crypto/asn1/a_print.c +0 -28
  294. data/third_party/boringssl/crypto/asn1/a_strnid.c +3 -0
  295. data/third_party/boringssl/crypto/asn1/a_time.c +17 -9
  296. data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -1
  297. data/third_party/boringssl/crypto/asn1/asn1_lib.c +5 -49
  298. data/third_party/boringssl/crypto/asn1/asn1_locl.h +1 -1
  299. data/third_party/boringssl/crypto/asn1/tasn_dec.c +9 -9
  300. data/third_party/boringssl/crypto/asn1/tasn_enc.c +0 -6
  301. data/third_party/boringssl/crypto/asn1/time_support.c +5 -5
  302. data/third_party/boringssl/crypto/base64/base64.c +65 -43
  303. data/third_party/boringssl/crypto/bio/bio.c +134 -110
  304. data/third_party/boringssl/crypto/bio/bio_mem.c +9 -9
  305. data/third_party/boringssl/crypto/bio/connect.c +17 -17
  306. data/third_party/boringssl/crypto/bio/fd.c +2 -1
  307. data/third_party/boringssl/crypto/bio/file.c +14 -14
  308. data/third_party/boringssl/crypto/bio/hexdump.c +15 -16
  309. data/third_party/boringssl/crypto/bio/internal.h +14 -14
  310. data/third_party/boringssl/crypto/bio/pair.c +45 -45
  311. data/third_party/boringssl/crypto/bio/printf.c +6 -10
  312. data/third_party/boringssl/crypto/{bn → bn_extra}/bn_asn1.c +9 -9
  313. data/third_party/boringssl/crypto/{bn → bn_extra}/convert.c +18 -223
  314. data/third_party/boringssl/crypto/buf/buf.c +20 -44
  315. data/third_party/boringssl/crypto/bytestring/ber.c +35 -35
  316. data/third_party/boringssl/crypto/bytestring/cbb.c +24 -24
  317. data/third_party/boringssl/crypto/bytestring/cbs.c +33 -37
  318. data/third_party/boringssl/crypto/bytestring/internal.h +38 -38
  319. data/third_party/boringssl/crypto/chacha/chacha.c +7 -7
  320. data/third_party/boringssl/crypto/{asn1/t_bitst.c → cipher_extra/cipher_extra.c} +49 -38
  321. data/third_party/boringssl/crypto/{cipher → cipher_extra}/derive_key.c +0 -2
  322. data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +281 -0
  323. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +867 -0
  324. data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +326 -0
  325. data/third_party/boringssl/crypto/{cipher → cipher_extra}/e_null.c +0 -1
  326. data/third_party/boringssl/crypto/{cipher → cipher_extra}/e_rc2.c +22 -10
  327. data/third_party/boringssl/crypto/{cipher → cipher_extra}/e_rc4.c +0 -0
  328. data/third_party/boringssl/crypto/{cipher → cipher_extra}/e_ssl3.c +120 -64
  329. data/third_party/boringssl/crypto/{cipher → cipher_extra}/e_tls.c +220 -141
  330. data/third_party/boringssl/crypto/{asn1/x_bignum.c → cipher_extra/internal.h} +61 -86
  331. data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +482 -0
  332. data/third_party/boringssl/crypto/cmac/cmac.c +20 -20
  333. data/third_party/boringssl/crypto/conf/conf.c +32 -20
  334. data/third_party/boringssl/crypto/conf/internal.h +3 -3
  335. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +5 -5
  336. data/third_party/boringssl/crypto/cpu-arm-linux.c +44 -41
  337. data/third_party/boringssl/crypto/cpu-intel.c +68 -43
  338. data/third_party/boringssl/crypto/cpu-ppc64le.c +5 -7
  339. data/third_party/boringssl/crypto/crypto.c +54 -32
  340. data/third_party/boringssl/crypto/curve25519/curve25519.c +269 -269
  341. data/third_party/boringssl/crypto/curve25519/internal.h +28 -8
  342. data/third_party/boringssl/crypto/curve25519/spake25519.c +180 -106
  343. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +9 -9
  344. data/third_party/boringssl/crypto/dh/check.c +33 -34
  345. data/third_party/boringssl/crypto/dh/dh.c +72 -36
  346. data/third_party/boringssl/crypto/dh/dh_asn1.c +1 -1
  347. data/third_party/boringssl/crypto/dh/params.c +1 -161
  348. data/third_party/boringssl/crypto/digest_extra/digest_extra.c +240 -0
  349. data/third_party/boringssl/crypto/dsa/dsa.c +127 -87
  350. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +1 -1
  351. data/third_party/boringssl/crypto/{ec → ec_extra}/ec_asn1.c +83 -70
  352. data/third_party/boringssl/crypto/ecdh/ecdh.c +1 -1
  353. data/third_party/boringssl/crypto/{ecdsa → ecdsa_extra}/ecdsa_asn1.c +86 -31
  354. data/third_party/boringssl/crypto/engine/engine.c +6 -6
  355. data/third_party/boringssl/crypto/err/err.c +197 -106
  356. data/third_party/boringssl/crypto/err/internal.h +58 -0
  357. data/third_party/boringssl/crypto/evp/digestsign.c +86 -14
  358. data/third_party/boringssl/crypto/evp/evp.c +6 -11
  359. data/third_party/boringssl/crypto/evp/evp_asn1.c +17 -17
  360. data/third_party/boringssl/crypto/evp/evp_ctx.c +15 -11
  361. data/third_party/boringssl/crypto/evp/internal.h +66 -51
  362. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +11 -11
  363. data/third_party/boringssl/crypto/evp/p_ec.c +10 -8
  364. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +11 -12
  365. data/third_party/boringssl/crypto/evp/p_ed25519.c +71 -0
  366. data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +190 -0
  367. data/third_party/boringssl/crypto/evp/p_rsa.c +50 -95
  368. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +28 -18
  369. data/third_party/boringssl/crypto/evp/pbkdf.c +49 -56
  370. data/third_party/boringssl/crypto/evp/print.c +5 -36
  371. data/third_party/boringssl/crypto/evp/scrypt.c +209 -0
  372. data/third_party/boringssl/crypto/ex_data.c +15 -45
  373. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +100 -0
  374. data/third_party/boringssl/crypto/fipsmodule/bcm.c +679 -0
  375. data/third_party/boringssl/crypto/{bn → fipsmodule/bn}/internal.h +40 -27
  376. data/third_party/boringssl/crypto/{bn → fipsmodule/bn}/rsaz_exp.h +0 -0
  377. data/third_party/boringssl/crypto/{cipher → fipsmodule/cipher}/internal.h +34 -67
  378. data/third_party/boringssl/crypto/fipsmodule/delocate.h +88 -0
  379. data/third_party/boringssl/crypto/{des → fipsmodule/des}/internal.h +18 -4
  380. data/third_party/boringssl/crypto/{digest → fipsmodule/digest}/internal.h +18 -18
  381. data/third_party/boringssl/crypto/{digest → fipsmodule/digest}/md32_common.h +58 -64
  382. data/third_party/boringssl/crypto/{ec → fipsmodule/ec}/internal.h +58 -52
  383. data/third_party/boringssl/crypto/{ec → fipsmodule/ec}/p256-x86_64-table.h +11 -11
  384. data/third_party/boringssl/crypto/{ec → fipsmodule/ec}/p256-x86_64.h +32 -32
  385. data/third_party/boringssl/crypto/{rand/internal.h → fipsmodule/is_fips.c} +10 -15
  386. data/third_party/boringssl/crypto/{modes → fipsmodule/modes}/internal.h +112 -119
  387. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +92 -0
  388. data/third_party/boringssl/crypto/{rsa → fipsmodule/rsa}/internal.h +36 -49
  389. data/third_party/boringssl/crypto/hkdf/hkdf.c +6 -6
  390. data/third_party/boringssl/crypto/internal.h +301 -233
  391. data/third_party/boringssl/crypto/lhash/lhash.c +26 -45
  392. data/third_party/boringssl/crypto/mem.c +76 -33
  393. data/third_party/boringssl/crypto/obj/obj.c +44 -28
  394. data/third_party/boringssl/crypto/obj/obj_dat.h +102 -34
  395. data/third_party/boringssl/crypto/obj/obj_xref.c +6 -6
  396. data/third_party/boringssl/crypto/pem/pem_info.c +3 -5
  397. data/third_party/boringssl/crypto/pem/pem_lib.c +1 -6
  398. data/third_party/boringssl/crypto/pem/pem_pk8.c +1 -0
  399. data/third_party/boringssl/crypto/pem/pem_pkey.c +1 -1
  400. data/third_party/boringssl/crypto/pem/pem_xaux.c +0 -2
  401. data/third_party/boringssl/crypto/pkcs7/internal.h +49 -0
  402. data/third_party/boringssl/crypto/pkcs7/pkcs7.c +166 -0
  403. data/third_party/boringssl/crypto/{x509/pkcs7.c → pkcs7/pkcs7_x509.c} +27 -147
  404. data/third_party/boringssl/crypto/pkcs8/internal.h +34 -16
  405. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +120 -39
  406. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +144 -857
  407. data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +789 -0
  408. data/third_party/boringssl/crypto/poly1305/internal.h +4 -3
  409. data/third_party/boringssl/crypto/poly1305/poly1305.c +14 -14
  410. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +11 -11
  411. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +41 -41
  412. data/third_party/boringssl/crypto/pool/internal.h +2 -2
  413. data/third_party/boringssl/crypto/pool/pool.c +15 -15
  414. data/third_party/boringssl/crypto/{rand → rand_extra}/deterministic.c +7 -7
  415. data/third_party/boringssl/crypto/rand_extra/forkunsafe.c +46 -0
  416. data/third_party/boringssl/crypto/{rand → rand_extra}/fuchsia.c +7 -7
  417. data/third_party/boringssl/crypto/rand_extra/rand_extra.c +70 -0
  418. data/third_party/boringssl/crypto/{rand → rand_extra}/windows.c +5 -5
  419. data/third_party/boringssl/crypto/refcount_c11.c +2 -2
  420. data/third_party/boringssl/crypto/refcount_lock.c +1 -1
  421. data/third_party/boringssl/crypto/{rsa → rsa_extra}/rsa_asn1.c +12 -120
  422. data/third_party/boringssl/crypto/stack/stack.c +13 -13
  423. data/third_party/boringssl/crypto/thread_none.c +1 -1
  424. data/third_party/boringssl/crypto/thread_pthread.c +1 -1
  425. data/third_party/boringssl/crypto/thread_win.c +40 -40
  426. data/third_party/boringssl/crypto/x509/a_sign.c +5 -12
  427. data/third_party/boringssl/crypto/x509/a_verify.c +6 -18
  428. data/third_party/boringssl/crypto/x509/algorithm.c +22 -6
  429. data/third_party/boringssl/crypto/x509/asn1_gen.c +30 -7
  430. data/third_party/boringssl/crypto/x509/by_dir.c +2 -2
  431. data/third_party/boringssl/crypto/x509/by_file.c +2 -2
  432. data/third_party/boringssl/crypto/x509/rsa_pss.c +5 -5
  433. data/third_party/boringssl/crypto/x509/t_x509.c +2 -1
  434. data/third_party/boringssl/crypto/x509/x509_def.c +5 -0
  435. data/third_party/boringssl/crypto/x509/x509_lu.c +35 -4
  436. data/third_party/boringssl/crypto/x509/x509_set.c +10 -0
  437. data/third_party/boringssl/crypto/x509/x509_vfy.c +20 -17
  438. data/third_party/boringssl/crypto/x509/x_name.c +13 -16
  439. data/third_party/boringssl/crypto/x509/x_x509.c +3 -3
  440. data/third_party/boringssl/crypto/x509/x_x509a.c +0 -7
  441. data/third_party/boringssl/crypto/x509v3/ext_dat.h +8 -0
  442. data/third_party/boringssl/crypto/x509v3/pcy_int.h +2 -2
  443. data/third_party/boringssl/crypto/x509v3/pcy_lib.c +0 -9
  444. data/third_party/boringssl/crypto/x509v3/pcy_node.c +1 -1
  445. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +25 -15
  446. data/third_party/boringssl/crypto/x509v3/v3_alt.c +21 -11
  447. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +9 -3
  448. data/third_party/boringssl/crypto/x509v3/v3_info.c +22 -14
  449. data/third_party/boringssl/crypto/x509v3/v3_ncons.c +27 -11
  450. data/third_party/boringssl/crypto/x509v3/v3_pci.c +0 -33
  451. data/third_party/boringssl/crypto/x509v3/v3_utl.c +4 -4
  452. data/third_party/boringssl/include/openssl/aead.h +280 -191
  453. data/third_party/boringssl/include/openssl/aes.h +50 -50
  454. data/third_party/boringssl/include/openssl/arm_arch.h +12 -12
  455. data/third_party/boringssl/include/openssl/asn1.h +14 -77
  456. data/third_party/boringssl/include/openssl/asn1t.h +11 -15
  457. data/third_party/boringssl/include/openssl/base.h +78 -51
  458. data/third_party/boringssl/include/openssl/base64.h +68 -68
  459. data/third_party/boringssl/include/openssl/bio.h +472 -406
  460. data/third_party/boringssl/include/openssl/blowfish.h +1 -1
  461. data/third_party/boringssl/include/openssl/bn.h +454 -435
  462. data/third_party/boringssl/include/openssl/buf.h +27 -27
  463. data/third_party/boringssl/include/openssl/bytestring.h +282 -267
  464. data/third_party/boringssl/include/openssl/cast.h +2 -2
  465. data/third_party/boringssl/include/openssl/chacha.h +5 -5
  466. data/third_party/boringssl/include/openssl/cipher.h +209 -200
  467. data/third_party/boringssl/include/openssl/cmac.h +27 -27
  468. data/third_party/boringssl/include/openssl/conf.h +49 -46
  469. data/third_party/boringssl/include/openssl/cpu.h +60 -45
  470. data/third_party/boringssl/include/openssl/crypto.h +59 -35
  471. data/third_party/boringssl/include/openssl/curve25519.h +97 -92
  472. data/third_party/boringssl/include/openssl/des.h +25 -25
  473. data/third_party/boringssl/include/openssl/dh.h +98 -97
  474. data/third_party/boringssl/include/openssl/digest.h +143 -114
  475. data/third_party/boringssl/include/openssl/dsa.h +217 -202
  476. data/third_party/boringssl/include/openssl/ec.h +132 -131
  477. data/third_party/boringssl/include/openssl/ec_key.h +132 -128
  478. data/third_party/boringssl/include/openssl/ecdh.h +9 -9
  479. data/third_party/boringssl/include/openssl/ecdsa.h +66 -66
  480. data/third_party/boringssl/include/openssl/engine.h +38 -38
  481. data/third_party/boringssl/include/openssl/err.h +189 -219
  482. data/third_party/boringssl/include/openssl/evp.h +473 -397
  483. data/third_party/boringssl/include/openssl/ex_data.h +46 -56
  484. data/third_party/boringssl/include/openssl/hkdf.h +17 -17
  485. data/third_party/boringssl/include/openssl/hmac.h +55 -43
  486. data/third_party/boringssl/include/openssl/is_boringssl.h +16 -0
  487. data/third_party/boringssl/include/openssl/lhash.h +67 -67
  488. data/third_party/boringssl/include/openssl/lhash_macros.h +4 -4
  489. data/third_party/boringssl/include/openssl/md4.h +14 -14
  490. data/third_party/boringssl/include/openssl/md5.h +14 -14
  491. data/third_party/boringssl/include/openssl/mem.h +39 -33
  492. data/third_party/boringssl/include/openssl/nid.h +43 -0
  493. data/third_party/boringssl/include/openssl/obj.h +93 -87
  494. data/third_party/boringssl/include/openssl/opensslconf.h +8 -1
  495. data/third_party/boringssl/include/openssl/pem.h +2 -122
  496. data/third_party/boringssl/include/openssl/pkcs7.h +68 -2
  497. data/third_party/boringssl/include/openssl/pkcs8.h +81 -66
  498. data/third_party/boringssl/include/openssl/poly1305.h +11 -11
  499. data/third_party/boringssl/include/openssl/pool.h +29 -25
  500. data/third_party/boringssl/include/openssl/rand.h +48 -45
  501. data/third_party/boringssl/include/openssl/rc4.h +9 -9
  502. data/third_party/boringssl/include/openssl/ripemd.h +13 -13
  503. data/third_party/boringssl/include/openssl/rsa.h +371 -340
  504. data/third_party/boringssl/include/openssl/sha.h +71 -71
  505. data/third_party/boringssl/include/openssl/span.h +191 -0
  506. data/third_party/boringssl/include/openssl/ssl.h +2639 -2519
  507. data/third_party/boringssl/include/openssl/ssl3.h +39 -122
  508. data/third_party/boringssl/include/openssl/stack.h +355 -164
  509. data/third_party/boringssl/include/openssl/thread.h +43 -43
  510. data/third_party/boringssl/include/openssl/tls1.h +60 -63
  511. data/third_party/boringssl/include/openssl/type_check.h +10 -14
  512. data/third_party/boringssl/include/openssl/x509.h +41 -116
  513. data/third_party/boringssl/include/openssl/x509_vfy.h +17 -25
  514. data/third_party/boringssl/include/openssl/x509v3.h +27 -21
  515. data/third_party/boringssl/ssl/{bio_ssl.c → bio_ssl.cc} +9 -5
  516. data/third_party/boringssl/ssl/{custom_extensions.c → custom_extensions.cc} +19 -12
  517. data/third_party/boringssl/ssl/{d1_both.c → d1_both.cc} +224 -193
  518. data/third_party/boringssl/ssl/{d1_lib.c → d1_lib.cc} +86 -79
  519. data/third_party/boringssl/ssl/{d1_pkt.c → d1_pkt.cc} +55 -87
  520. data/third_party/boringssl/ssl/{d1_srtp.c → d1_srtp.cc} +12 -16
  521. data/third_party/boringssl/ssl/{dtls_method.c → dtls_method.cc} +33 -50
  522. data/third_party/boringssl/ssl/{dtls_record.c → dtls_record.cc} +76 -64
  523. data/third_party/boringssl/ssl/handshake.cc +547 -0
  524. data/third_party/boringssl/ssl/handshake_client.cc +1828 -0
  525. data/third_party/boringssl/ssl/handshake_server.cc +1672 -0
  526. data/third_party/boringssl/ssl/internal.h +2027 -1280
  527. data/third_party/boringssl/ssl/s3_both.cc +603 -0
  528. data/third_party/boringssl/ssl/{s3_lib.c → s3_lib.cc} +22 -10
  529. data/third_party/boringssl/ssl/{s3_pkt.c → s3_pkt.cc} +171 -75
  530. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +415 -0
  531. data/third_party/boringssl/ssl/{ssl_asn1.c → ssl_asn1.cc} +257 -261
  532. data/third_party/boringssl/ssl/{ssl_buffer.c → ssl_buffer.cc} +81 -97
  533. data/third_party/boringssl/ssl/{ssl_cert.c → ssl_cert.cc} +304 -414
  534. data/third_party/boringssl/ssl/{ssl_cipher.c → ssl_cipher.cc} +427 -505
  535. data/third_party/boringssl/ssl/{ssl_file.c → ssl_file.cc} +24 -16
  536. data/third_party/boringssl/ssl/ssl_key_share.cc +245 -0
  537. data/third_party/boringssl/ssl/{ssl_lib.c → ssl_lib.cc} +665 -828
  538. data/third_party/boringssl/ssl/ssl_privkey.cc +518 -0
  539. data/third_party/boringssl/ssl/{ssl_session.c → ssl_session.cc} +596 -471
  540. data/third_party/boringssl/ssl/{ssl_stat.c → ssl_stat.cc} +5 -224
  541. data/third_party/boringssl/ssl/{ssl_transcript.c → ssl_transcript.cc} +117 -140
  542. data/third_party/boringssl/ssl/ssl_versions.cc +439 -0
  543. data/third_party/boringssl/ssl/{ssl_x509.c → ssl_x509.cc} +751 -267
  544. data/third_party/boringssl/ssl/{t1_enc.c → t1_enc.cc} +120 -161
  545. data/third_party/boringssl/ssl/{t1_lib.c → t1_lib.cc} +859 -966
  546. data/third_party/boringssl/ssl/{tls13_both.c → tls13_both.cc} +202 -284
  547. data/third_party/boringssl/ssl/tls13_client.cc +842 -0
  548. data/third_party/boringssl/ssl/{tls13_enc.c → tls13_enc.cc} +108 -90
  549. data/third_party/boringssl/ssl/tls13_server.cc +967 -0
  550. data/third_party/boringssl/ssl/{tls_method.c → tls_method.cc} +94 -73
  551. data/third_party/boringssl/ssl/tls_record.cc +675 -0
  552. metadata +117 -168
  553. data/include/grpc/support/cmdline.h +0 -88
  554. data/include/grpc/support/subprocess.h +0 -44
  555. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -29
  556. data/src/core/ext/filters/client_channel/resolver_factory.cc +0 -40
  557. data/src/core/lib/gpr/cmdline.cc +0 -330
  558. data/src/core/lib/gpr/subprocess_posix.cc +0 -99
  559. data/src/core/lib/gpr/subprocess_windows.cc +0 -126
  560. data/src/core/lib/surface/alarm.cc +0 -137
  561. data/src/core/lib/surface/alarm_internal.h +0 -40
  562. data/src/core/tsi/gts_transport_security.cc +0 -40
  563. data/third_party/boringssl/crypto/aes/aes.c +0 -1142
  564. data/third_party/boringssl/crypto/aes/internal.h +0 -87
  565. data/third_party/boringssl/crypto/aes/key_wrap.c +0 -138
  566. data/third_party/boringssl/crypto/aes/mode_wrappers.c +0 -112
  567. data/third_party/boringssl/crypto/asn1/x_long.c +0 -200
  568. data/third_party/boringssl/crypto/bn/add.c +0 -377
  569. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -532
  570. data/third_party/boringssl/crypto/bn/bn.c +0 -365
  571. data/third_party/boringssl/crypto/bn/cmp.c +0 -239
  572. data/third_party/boringssl/crypto/bn/ctx.c +0 -313
  573. data/third_party/boringssl/crypto/bn/div.c +0 -728
  574. data/third_party/boringssl/crypto/bn/exponentiation.c +0 -1240
  575. data/third_party/boringssl/crypto/bn/gcd.c +0 -635
  576. data/third_party/boringssl/crypto/bn/generic.c +0 -707
  577. data/third_party/boringssl/crypto/bn/kronecker.c +0 -176
  578. data/third_party/boringssl/crypto/bn/montgomery.c +0 -409
  579. data/third_party/boringssl/crypto/bn/montgomery_inv.c +0 -207
  580. data/third_party/boringssl/crypto/bn/mul.c +0 -871
  581. data/third_party/boringssl/crypto/bn/prime.c +0 -861
  582. data/third_party/boringssl/crypto/bn/random.c +0 -343
  583. data/third_party/boringssl/crypto/bn/rsaz_exp.c +0 -254
  584. data/third_party/boringssl/crypto/bn/shift.c +0 -307
  585. data/third_party/boringssl/crypto/bn/sqrt.c +0 -506
  586. data/third_party/boringssl/crypto/cipher/aead.c +0 -156
  587. data/third_party/boringssl/crypto/cipher/cipher.c +0 -657
  588. data/third_party/boringssl/crypto/cipher/e_aes.c +0 -1771
  589. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +0 -276
  590. data/third_party/boringssl/crypto/cipher/e_des.c +0 -205
  591. data/third_party/boringssl/crypto/cipher/tls_cbc.c +0 -482
  592. data/third_party/boringssl/crypto/des/des.c +0 -771
  593. data/third_party/boringssl/crypto/digest/digest.c +0 -251
  594. data/third_party/boringssl/crypto/digest/digests.c +0 -358
  595. data/third_party/boringssl/crypto/ec/ec.c +0 -847
  596. data/third_party/boringssl/crypto/ec/ec_key.c +0 -479
  597. data/third_party/boringssl/crypto/ec/ec_montgomery.c +0 -303
  598. data/third_party/boringssl/crypto/ec/oct.c +0 -416
  599. data/third_party/boringssl/crypto/ec/p224-64.c +0 -1143
  600. data/third_party/boringssl/crypto/ec/p256-64.c +0 -1701
  601. data/third_party/boringssl/crypto/ec/p256-x86_64.c +0 -561
  602. data/third_party/boringssl/crypto/ec/simple.c +0 -1118
  603. data/third_party/boringssl/crypto/ec/util-64.c +0 -109
  604. data/third_party/boringssl/crypto/ec/wnaf.c +0 -458
  605. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +0 -479
  606. data/third_party/boringssl/crypto/hmac/hmac.c +0 -215
  607. data/third_party/boringssl/crypto/md4/md4.c +0 -236
  608. data/third_party/boringssl/crypto/md5/md5.c +0 -285
  609. data/third_party/boringssl/crypto/modes/cbc.c +0 -212
  610. data/third_party/boringssl/crypto/modes/cfb.c +0 -230
  611. data/third_party/boringssl/crypto/modes/ctr.c +0 -219
  612. data/third_party/boringssl/crypto/modes/gcm.c +0 -1071
  613. data/third_party/boringssl/crypto/modes/ofb.c +0 -95
  614. data/third_party/boringssl/crypto/modes/polyval.c +0 -94
  615. data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +0 -85
  616. data/third_party/boringssl/crypto/rand/rand.c +0 -244
  617. data/third_party/boringssl/crypto/rand/urandom.c +0 -335
  618. data/third_party/boringssl/crypto/rsa/blinding.c +0 -265
  619. data/third_party/boringssl/crypto/rsa/padding.c +0 -708
  620. data/third_party/boringssl/crypto/rsa/rsa.c +0 -830
  621. data/third_party/boringssl/crypto/rsa/rsa_impl.c +0 -1100
  622. data/third_party/boringssl/crypto/sha/sha1-altivec.c +0 -346
  623. data/third_party/boringssl/crypto/sha/sha1.c +0 -355
  624. data/third_party/boringssl/crypto/sha/sha256.c +0 -329
  625. data/third_party/boringssl/crypto/sha/sha512.c +0 -609
  626. data/third_party/boringssl/crypto/x509/x509type.c +0 -126
  627. data/third_party/boringssl/include/openssl/stack_macros.h +0 -3987
  628. data/third_party/boringssl/ssl/handshake_client.c +0 -1883
  629. data/third_party/boringssl/ssl/handshake_server.c +0 -1950
  630. data/third_party/boringssl/ssl/s3_both.c +0 -895
  631. data/third_party/boringssl/ssl/ssl_aead_ctx.c +0 -335
  632. data/third_party/boringssl/ssl/ssl_ecdh.c +0 -465
  633. data/third_party/boringssl/ssl/ssl_privkey.c +0 -683
  634. data/third_party/boringssl/ssl/ssl_privkey_cc.cc +0 -76
  635. data/third_party/boringssl/ssl/tls13_client.c +0 -712
  636. data/third_party/boringssl/ssl/tls13_server.c +0 -680
  637. data/third_party/boringssl/ssl/tls_record.c +0 -556
@@ -22,37 +22,55 @@
22
22
  #include <openssl/bio.h>
23
23
  #include <openssl/err.h>
24
24
  #include <openssl/mem.h>
25
- #include <openssl/type_check.h>
26
25
 
27
26
  #include "../crypto/internal.h"
28
27
  #include "internal.h"
29
28
 
30
29
 
31
- OPENSSL_COMPILE_ASSERT(0xffff <= INT_MAX, uint16_fits_in_int);
30
+ namespace bssl {
32
31
 
33
- OPENSSL_COMPILE_ASSERT((SSL3_ALIGN_PAYLOAD & (SSL3_ALIGN_PAYLOAD - 1)) == 0,
34
- align_to_a_power_of_two);
32
+ // BIO uses int instead of size_t. No lengths will exceed uint16_t, so this will
33
+ // not overflow.
34
+ static_assert(0xffff <= INT_MAX, "uint16_t does not fit in int");
35
35
 
36
- /* setup_buffer initializes |buf| with capacity |cap|, aligned such that data
37
- * written after |header_len| is aligned to a |SSL3_ALIGN_PAYLOAD|-byte
38
- * boundary. It returns one on success and zero on error. */
39
- static int setup_buffer(SSL3_BUFFER *buf, size_t header_len, size_t cap) {
40
- if (buf->buf != NULL || cap > 0xffff) {
36
+ static_assert((SSL3_ALIGN_PAYLOAD & (SSL3_ALIGN_PAYLOAD - 1)) == 0,
37
+ "SSL3_ALIGN_PAYLOAD must be a power of 2");
38
+
39
+ // ensure_buffer ensures |buf| has capacity at least |cap|, aligned such that
40
+ // data written after |header_len| is aligned to a |SSL3_ALIGN_PAYLOAD|-byte
41
+ // boundary. It returns one on success and zero on error.
42
+ static int ensure_buffer(SSL3_BUFFER *buf, size_t header_len, size_t cap) {
43
+ if (cap > 0xffff) {
41
44
  OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
42
45
  return 0;
43
46
  }
44
47
 
45
- /* Add up to |SSL3_ALIGN_PAYLOAD| - 1 bytes of slack for alignment. */
46
- buf->buf = OPENSSL_malloc(cap + SSL3_ALIGN_PAYLOAD - 1);
47
- if (buf->buf == NULL) {
48
+ if (buf->cap >= cap) {
49
+ return 1;
50
+ }
51
+
52
+ // Add up to |SSL3_ALIGN_PAYLOAD| - 1 bytes of slack for alignment.
53
+ //
54
+ // Since this buffer gets allocated quite frequently and doesn't contain any
55
+ // sensitive data, we allocate with malloc rather than |OPENSSL_malloc| and
56
+ // avoid zeroing on free.
57
+ uint8_t *new_buf = (uint8_t *)malloc(cap + SSL3_ALIGN_PAYLOAD - 1);
58
+ if (new_buf == NULL) {
48
59
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
49
60
  return 0;
50
61
  }
51
62
 
52
- /* Arrange the buffer such that the record body is aligned. */
53
- buf->offset = (0 - header_len - (uintptr_t)buf->buf) &
54
- (SSL3_ALIGN_PAYLOAD - 1);
55
- buf->len = 0;
63
+ // Offset the buffer such that the record body is aligned.
64
+ size_t new_offset =
65
+ (0 - header_len - (uintptr_t)new_buf) & (SSL3_ALIGN_PAYLOAD - 1);
66
+
67
+ if (buf->buf != NULL) {
68
+ OPENSSL_memcpy(new_buf + new_offset, buf->buf + buf->offset, buf->len);
69
+ free(buf->buf); // Allocated with malloc().
70
+ }
71
+
72
+ buf->buf = new_buf;
73
+ buf->offset = new_offset;
56
74
  buf->cap = cap;
57
75
  return 1;
58
76
  }
@@ -67,59 +85,32 @@ static void consume_buffer(SSL3_BUFFER *buf, size_t len) {
67
85
  }
68
86
 
69
87
  static void clear_buffer(SSL3_BUFFER *buf) {
70
- OPENSSL_free(buf->buf);
88
+ free(buf->buf); // Allocated with malloc().
71
89
  OPENSSL_memset(buf, 0, sizeof(SSL3_BUFFER));
72
90
  }
73
91
 
74
- OPENSSL_COMPILE_ASSERT(DTLS1_RT_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH <=
75
- 0xffff,
76
- maximum_read_buffer_too_large);
77
-
78
- /* setup_read_buffer initializes the read buffer if not already initialized. It
79
- * returns one on success and zero on failure. */
80
- static int setup_read_buffer(SSL *ssl) {
81
- SSL3_BUFFER *buf = &ssl->s3->read_buffer;
82
-
83
- if (buf->buf != NULL) {
84
- return 1;
85
- }
86
-
87
- size_t header_len = ssl_record_prefix_len(ssl);
88
- size_t cap = SSL3_RT_MAX_ENCRYPTED_LENGTH;
89
- if (SSL_is_dtls(ssl)) {
90
- cap += DTLS1_RT_HEADER_LENGTH;
91
- } else {
92
- cap += SSL3_RT_HEADER_LENGTH;
93
- }
94
-
95
- return setup_buffer(buf, header_len, cap);
96
- }
97
-
98
- uint8_t *ssl_read_buffer(SSL *ssl) {
99
- return ssl->s3->read_buffer.buf + ssl->s3->read_buffer.offset;
100
- }
101
-
102
- size_t ssl_read_buffer_len(const SSL *ssl) {
103
- return ssl->s3->read_buffer.len;
92
+ Span<uint8_t> ssl_read_buffer(SSL *ssl) {
93
+ return MakeSpan(ssl->s3->read_buffer.buf + ssl->s3->read_buffer.offset,
94
+ ssl->s3->read_buffer.len);
104
95
  }
105
96
 
106
97
  static int dtls_read_buffer_next_packet(SSL *ssl) {
107
98
  SSL3_BUFFER *buf = &ssl->s3->read_buffer;
108
99
 
109
100
  if (buf->len > 0) {
110
- /* It is an error to call |dtls_read_buffer_extend| when the read buffer is
111
- * not empty. */
101
+ // It is an error to call |dtls_read_buffer_extend| when the read buffer is
102
+ // not empty.
112
103
  OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
113
104
  return -1;
114
105
  }
115
106
 
116
- /* Read a single packet from |ssl->rbio|. |buf->cap| must fit in an int. */
107
+ // Read a single packet from |ssl->rbio|. |buf->cap| must fit in an int.
117
108
  int ret = BIO_read(ssl->rbio, buf->buf + buf->offset, (int)buf->cap);
118
109
  if (ret <= 0) {
119
110
  ssl->rwstate = SSL_READING;
120
111
  return ret;
121
112
  }
122
- /* |BIO_read| was bound by |buf->cap|, so this cannot overflow. */
113
+ // |BIO_read| was bound by |buf->cap|, so this cannot overflow.
123
114
  buf->len = (uint16_t)ret;
124
115
  return 1;
125
116
  }
@@ -132,18 +123,18 @@ static int tls_read_buffer_extend_to(SSL *ssl, size_t len) {
132
123
  return -1;
133
124
  }
134
125
 
135
- /* Read until the target length is reached. */
126
+ // Read until the target length is reached.
136
127
  while (buf->len < len) {
137
- /* The amount of data to read is bounded by |buf->cap|, which must fit in an
138
- * int. */
128
+ // The amount of data to read is bounded by |buf->cap|, which must fit in an
129
+ // int.
139
130
  int ret = BIO_read(ssl->rbio, buf->buf + buf->offset + buf->len,
140
131
  (int)(len - buf->len));
141
132
  if (ret <= 0) {
142
133
  ssl->rwstate = SSL_READING;
143
134
  return ret;
144
135
  }
145
- /* |BIO_read| was bound by |buf->cap - buf->len|, so this cannot
146
- * overflow. */
136
+ // |BIO_read| was bound by |buf->cap - buf->len|, so this cannot
137
+ // overflow.
147
138
  buf->len += (uint16_t)ret;
148
139
  }
149
140
 
@@ -151,10 +142,19 @@ static int tls_read_buffer_extend_to(SSL *ssl, size_t len) {
151
142
  }
152
143
 
153
144
  int ssl_read_buffer_extend_to(SSL *ssl, size_t len) {
154
- /* |ssl_read_buffer_extend_to| implicitly discards any consumed data. */
145
+ // |ssl_read_buffer_extend_to| implicitly discards any consumed data.
155
146
  ssl_read_buffer_discard(ssl);
156
147
 
157
- if (!setup_read_buffer(ssl)) {
148
+ if (SSL_is_dtls(ssl)) {
149
+ static_assert(
150
+ DTLS1_RT_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH <= 0xffff,
151
+ "DTLS read buffer is too large");
152
+
153
+ // The |len| parameter is ignored in DTLS.
154
+ len = DTLS1_RT_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH;
155
+ }
156
+
157
+ if (!ensure_buffer(&ssl->s3->read_buffer, ssl_record_prefix_len(ssl), len)) {
158
158
  return -1;
159
159
  }
160
160
 
@@ -165,15 +165,15 @@ int ssl_read_buffer_extend_to(SSL *ssl, size_t len) {
165
165
 
166
166
  int ret;
167
167
  if (SSL_is_dtls(ssl)) {
168
- /* |len| is ignored for a datagram transport. */
168
+ // |len| is ignored for a datagram transport.
169
169
  ret = dtls_read_buffer_next_packet(ssl);
170
170
  } else {
171
171
  ret = tls_read_buffer_extend_to(ssl, len);
172
172
  }
173
173
 
174
174
  if (ret <= 0) {
175
- /* If the buffer was empty originally and remained empty after attempting to
176
- * extend it, release the buffer until the next attempt. */
175
+ // If the buffer was empty originally and remained empty after attempting to
176
+ // extend it, release the buffer until the next attempt.
177
177
  ssl_read_buffer_discard(ssl);
178
178
  }
179
179
  return ret;
@@ -184,11 +184,11 @@ void ssl_read_buffer_consume(SSL *ssl, size_t len) {
184
184
 
185
185
  consume_buffer(buf, len);
186
186
 
187
- /* The TLS stack never reads beyond the current record, so there will never be
188
- * unconsumed data. If read-ahead is ever reimplemented,
189
- * |ssl_read_buffer_discard| will require a |memcpy| to shift the excess back
190
- * to the front of the buffer, to ensure there is enough space for the next
191
- * record. */
187
+ // The TLS stack never reads beyond the current record, so there will never be
188
+ // unconsumed data. If read-ahead is ever reimplemented,
189
+ // |ssl_read_buffer_discard| will require a |memcpy| to shift the excess back
190
+ // to the front of the buffer, to ensure there is enough space for the next
191
+ // record.
192
192
  assert(SSL_is_dtls(ssl) || len == 0 || buf->len == 0);
193
193
  }
194
194
 
@@ -207,15 +207,16 @@ int ssl_write_buffer_is_pending(const SSL *ssl) {
207
207
  return ssl->s3->write_buffer.len > 0;
208
208
  }
209
209
 
210
- OPENSSL_COMPILE_ASSERT(SSL3_RT_HEADER_LENGTH * 2 +
211
- SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD * 2 +
212
- SSL3_RT_MAX_PLAIN_LENGTH <= 0xffff,
213
- maximum_tls_write_buffer_too_large);
210
+ static_assert(SSL3_RT_HEADER_LENGTH * 2 +
211
+ SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD * 2 +
212
+ SSL3_RT_MAX_PLAIN_LENGTH <=
213
+ 0xffff,
214
+ "maximum TLS write buffer is too large");
214
215
 
215
- OPENSSL_COMPILE_ASSERT(DTLS1_RT_HEADER_LENGTH +
216
- SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD +
217
- SSL3_RT_MAX_PLAIN_LENGTH <= 0xffff,
218
- maximum_dtls_write_buffer_too_large);
216
+ static_assert(DTLS1_RT_HEADER_LENGTH + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD +
217
+ SSL3_RT_MAX_PLAIN_LENGTH <=
218
+ 0xffff,
219
+ "maximum DTLS write buffer is too large");
219
220
 
220
221
  int ssl_write_buffer_init(SSL *ssl, uint8_t **out_ptr, size_t max_len) {
221
222
  SSL3_BUFFER *buf = &ssl->s3->write_buffer;
@@ -225,26 +226,7 @@ int ssl_write_buffer_init(SSL *ssl, uint8_t **out_ptr, size_t max_len) {
225
226
  return 0;
226
227
  }
227
228
 
228
- size_t header_len = ssl_seal_align_prefix_len(ssl);
229
-
230
- /* TODO(davidben): This matches the original behavior in keeping the malloc
231
- * size consistent. Does this matter? |cap| could just be |max_len|. */
232
- size_t cap = SSL3_RT_MAX_PLAIN_LENGTH + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD;
233
- if (SSL_is_dtls(ssl)) {
234
- cap += DTLS1_RT_HEADER_LENGTH;
235
- } else {
236
- cap += SSL3_RT_HEADER_LENGTH;
237
- if (ssl->mode & SSL_MODE_CBC_RECORD_SPLITTING) {
238
- cap += SSL3_RT_HEADER_LENGTH + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD;
239
- }
240
- }
241
-
242
- if (max_len > cap) {
243
- OPENSSL_PUT_ERROR(SSL, SSL_R_BUFFER_TOO_SMALL);
244
- return 0;
245
- }
246
-
247
- if (!setup_buffer(buf, header_len, cap)) {
229
+ if (!ensure_buffer(buf, ssl_seal_align_prefix_len(ssl), max_len)) {
248
230
  return 0;
249
231
  }
250
232
  *out_ptr = buf->buf + buf->offset;
@@ -284,9 +266,9 @@ static int dtls_write_buffer_flush(SSL *ssl) {
284
266
  int ret = BIO_write(ssl->wbio, buf->buf + buf->offset, buf->len);
285
267
  if (ret <= 0) {
286
268
  ssl->rwstate = SSL_WRITING;
287
- /* If the write failed, drop the write buffer anyway. Datagram transports
288
- * can't write half a packet, so the caller is expected to retry from the
289
- * top. */
269
+ // If the write failed, drop the write buffer anyway. Datagram transports
270
+ // can't write half a packet, so the caller is expected to retry from the
271
+ // top.
290
272
  ssl_write_buffer_clear(ssl);
291
273
  return ret;
292
274
  }
@@ -310,3 +292,5 @@ int ssl_write_buffer_flush(SSL *ssl) {
310
292
  void ssl_write_buffer_clear(SSL *ssl) {
311
293
  clear_buffer(&ssl->s3->write_buffer);
312
294
  }
295
+
296
+ } // namespace bssl
@@ -118,31 +118,25 @@
118
118
  #include <limits.h>
119
119
  #include <string.h>
120
120
 
121
+ #include <utility>
122
+
121
123
  #include <openssl/bn.h>
122
124
  #include <openssl/buf.h>
123
125
  #include <openssl/bytestring.h>
124
- #include <openssl/dh.h>
125
126
  #include <openssl/ec_key.h>
126
127
  #include <openssl/err.h>
127
128
  #include <openssl/mem.h>
128
129
  #include <openssl/sha.h>
129
130
  #include <openssl/x509.h>
130
- #include <openssl/x509v3.h>
131
131
 
132
132
  #include "../crypto/internal.h"
133
133
  #include "internal.h"
134
134
 
135
135
 
136
- int SSL_get_ex_data_X509_STORE_CTX_idx(void) {
137
- /* The ex_data index to go from |X509_STORE_CTX| to |SSL| always uses the
138
- * reserved app_data slot. Before ex_data was introduced, app_data was used.
139
- * Avoid breaking any software which assumes |X509_STORE_CTX_get_app_data|
140
- * works. */
141
- return 0;
142
- }
136
+ namespace bssl {
143
137
 
144
138
  CERT *ssl_cert_new(const SSL_X509_METHOD *x509_method) {
145
- CERT *ret = OPENSSL_malloc(sizeof(CERT));
139
+ CERT *ret = (CERT *)OPENSSL_malloc(sizeof(CERT));
146
140
  if (ret == NULL) {
147
141
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
148
142
  return NULL;
@@ -159,7 +153,7 @@ static CRYPTO_BUFFER *buffer_up_ref(CRYPTO_BUFFER *buffer) {
159
153
  }
160
154
 
161
155
  CERT *ssl_cert_dup(CERT *cert) {
162
- CERT *ret = OPENSSL_malloc(sizeof(CERT));
156
+ CERT *ret = (CERT *)OPENSSL_malloc(sizeof(CERT));
163
157
  if (ret == NULL) {
164
158
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
165
159
  return NULL;
@@ -177,18 +171,9 @@ CERT *ssl_cert_dup(CERT *cert) {
177
171
  ret->key_method = cert->key_method;
178
172
  ret->x509_method = cert->x509_method;
179
173
 
180
- if (cert->dh_tmp != NULL) {
181
- ret->dh_tmp = DHparams_dup(cert->dh_tmp);
182
- if (ret->dh_tmp == NULL) {
183
- OPENSSL_PUT_ERROR(SSL, ERR_R_DH_LIB);
184
- goto err;
185
- }
186
- }
187
- ret->dh_tmp_cb = cert->dh_tmp_cb;
188
-
189
174
  if (cert->sigalgs != NULL) {
190
- ret->sigalgs =
191
- BUF_memdup(cert->sigalgs, cert->num_sigalgs * sizeof(cert->sigalgs[0]));
175
+ ret->sigalgs = (uint16_t *)BUF_memdup(
176
+ cert->sigalgs, cert->num_sigalgs * sizeof(cert->sigalgs[0]));
192
177
  if (ret->sigalgs == NULL) {
193
178
  goto err;
194
179
  }
@@ -198,10 +183,7 @@ CERT *ssl_cert_dup(CERT *cert) {
198
183
  ret->cert_cb = cert->cert_cb;
199
184
  ret->cert_cb_arg = cert->cert_cb_arg;
200
185
 
201
- if (cert->verify_store != NULL) {
202
- X509_STORE_up_ref(cert->verify_store);
203
- ret->verify_store = cert->verify_store;
204
- }
186
+ ret->x509_method->cert_dup(ret, cert);
205
187
 
206
188
  if (cert->signed_cert_timestamp_list != NULL) {
207
189
  CRYPTO_BUFFER_up_ref(cert->signed_cert_timestamp_list);
@@ -216,6 +198,8 @@ CERT *ssl_cert_dup(CERT *cert) {
216
198
  ret->sid_ctx_length = cert->sid_ctx_length;
217
199
  OPENSSL_memcpy(ret->sid_ctx, cert->sid_ctx, sizeof(ret->sid_ctx));
218
200
 
201
+ ret->enable_early_data = cert->enable_early_data;
202
+
219
203
  return ret;
220
204
 
221
205
  err:
@@ -223,7 +207,7 @@ err:
223
207
  return NULL;
224
208
  }
225
209
 
226
- /* Free up and clear all certificates and chains */
210
+ // Free up and clear all certificates and chains
227
211
  void ssl_cert_clear_certs(CERT *cert) {
228
212
  if (cert == NULL) {
229
213
  return;
@@ -238,335 +222,226 @@ void ssl_cert_clear_certs(CERT *cert) {
238
222
  cert->key_method = NULL;
239
223
  }
240
224
 
241
- void ssl_cert_free(CERT *c) {
242
- if (c == NULL) {
225
+ void ssl_cert_free(CERT *cert) {
226
+ if (cert == NULL) {
243
227
  return;
244
228
  }
245
229
 
246
- DH_free(c->dh_tmp);
247
-
248
- ssl_cert_clear_certs(c);
249
- OPENSSL_free(c->sigalgs);
250
- X509_STORE_free(c->verify_store);
251
- CRYPTO_BUFFER_free(c->signed_cert_timestamp_list);
252
- CRYPTO_BUFFER_free(c->ocsp_response);
230
+ ssl_cert_clear_certs(cert);
231
+ cert->x509_method->cert_free(cert);
232
+ OPENSSL_free(cert->sigalgs);
233
+ CRYPTO_BUFFER_free(cert->signed_cert_timestamp_list);
234
+ CRYPTO_BUFFER_free(cert->ocsp_response);
253
235
 
254
- OPENSSL_free(c);
236
+ OPENSSL_free(cert);
255
237
  }
256
238
 
257
- static void ssl_cert_set_cert_cb(CERT *c, int (*cb)(SSL *ssl, void *arg),
239
+ static void ssl_cert_set_cert_cb(CERT *cert, int (*cb)(SSL *ssl, void *arg),
258
240
  void *arg) {
259
- c->cert_cb = cb;
260
- c->cert_cb_arg = arg;
261
- }
262
-
263
- int ssl_set_cert(CERT *cert, CRYPTO_BUFFER *buffer) {
241
+ cert->cert_cb = cb;
242
+ cert->cert_cb_arg = arg;
243
+ }
244
+
245
+ enum leaf_cert_and_privkey_result_t {
246
+ leaf_cert_and_privkey_error,
247
+ leaf_cert_and_privkey_ok,
248
+ leaf_cert_and_privkey_mismatch,
249
+ };
250
+
251
+ // check_leaf_cert_and_privkey checks whether the certificate in |leaf_buffer|
252
+ // and the private key in |privkey| are suitable and coherent. It returns
253
+ // |leaf_cert_and_privkey_error| and pushes to the error queue if a problem is
254
+ // found. If the certificate and private key are valid, but incoherent, it
255
+ // returns |leaf_cert_and_privkey_mismatch|. Otherwise it returns
256
+ // |leaf_cert_and_privkey_ok|.
257
+ static enum leaf_cert_and_privkey_result_t check_leaf_cert_and_privkey(
258
+ CRYPTO_BUFFER *leaf_buffer, EVP_PKEY *privkey) {
264
259
  CBS cert_cbs;
265
- CRYPTO_BUFFER_init_CBS(buffer, &cert_cbs);
266
- EVP_PKEY *pubkey = ssl_cert_parse_pubkey(&cert_cbs);
267
- if (pubkey == NULL) {
268
- return 0;
260
+ CRYPTO_BUFFER_init_CBS(leaf_buffer, &cert_cbs);
261
+ UniquePtr<EVP_PKEY> pubkey = ssl_cert_parse_pubkey(&cert_cbs);
262
+ if (!pubkey) {
263
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
264
+ return leaf_cert_and_privkey_error;
269
265
  }
270
266
 
271
267
  if (!ssl_is_key_type_supported(pubkey->type)) {
272
268
  OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CERTIFICATE_TYPE);
273
- EVP_PKEY_free(pubkey);
274
- return 0;
269
+ return leaf_cert_and_privkey_error;
275
270
  }
276
271
 
277
- /* An ECC certificate may be usable for ECDH or ECDSA. We only support ECDSA
278
- * certificates, so sanity-check the key usage extension. */
272
+ // An ECC certificate may be usable for ECDH or ECDSA. We only support ECDSA
273
+ // certificates, so sanity-check the key usage extension.
279
274
  if (pubkey->type == EVP_PKEY_EC &&
280
275
  !ssl_cert_check_digital_signature_key_usage(&cert_cbs)) {
281
276
  OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CERTIFICATE_TYPE);
282
- EVP_PKEY_free(pubkey);
283
- return 0;
284
- }
285
-
286
- if (cert->privatekey != NULL) {
287
- /* Sanity-check that the private key and the certificate match, unless the
288
- * key is opaque (in case of, say, a smartcard). */
289
- if (!EVP_PKEY_is_opaque(cert->privatekey) &&
290
- !ssl_compare_public_and_private_key(pubkey, cert->privatekey)) {
291
- /* don't fail for a cert/key mismatch, just free current private key
292
- * (when switching to a different cert & key, first this function should
293
- * be used, then ssl_set_pkey */
294
- EVP_PKEY_free(cert->privatekey);
295
- cert->privatekey = NULL;
296
- /* clear error queue */
297
- ERR_clear_error();
298
- }
299
- }
300
-
301
- EVP_PKEY_free(pubkey);
302
-
303
- cert->x509_method->cert_flush_cached_leaf(cert);
304
-
305
- if (cert->chain != NULL) {
306
- CRYPTO_BUFFER_free(sk_CRYPTO_BUFFER_value(cert->chain, 0));
307
- sk_CRYPTO_BUFFER_set(cert->chain, 0, buffer);
308
- CRYPTO_BUFFER_up_ref(buffer);
309
- return 1;
310
- }
311
-
312
- cert->chain = sk_CRYPTO_BUFFER_new_null();
313
- if (cert->chain == NULL) {
314
- return 0;
277
+ return leaf_cert_and_privkey_error;
315
278
  }
316
279
 
317
- if (!sk_CRYPTO_BUFFER_push(cert->chain, buffer)) {
318
- sk_CRYPTO_BUFFER_free(cert->chain);
319
- cert->chain = NULL;
320
- return 0;
280
+ if (privkey != NULL &&
281
+ // Sanity-check that the private key and the certificate match.
282
+ !ssl_compare_public_and_private_key(pubkey.get(), privkey)) {
283
+ ERR_clear_error();
284
+ return leaf_cert_and_privkey_mismatch;
321
285
  }
322
- CRYPTO_BUFFER_up_ref(buffer);
323
286
 
324
- return 1;
287
+ return leaf_cert_and_privkey_ok;
325
288
  }
326
289
 
327
- int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, size_t der_len,
328
- const uint8_t *der) {
329
- CRYPTO_BUFFER *buffer = CRYPTO_BUFFER_new(der, der_len, NULL);
330
- if (buffer == NULL) {
290
+ static int cert_set_chain_and_key(
291
+ CERT *cert, CRYPTO_BUFFER *const *certs, size_t num_certs,
292
+ EVP_PKEY *privkey, const SSL_PRIVATE_KEY_METHOD *privkey_method) {
293
+ if (num_certs == 0 ||
294
+ (privkey == NULL && privkey_method == NULL)) {
295
+ OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER);
331
296
  return 0;
332
297
  }
333
298
 
334
- const int ok = ssl_set_cert(ctx->cert, buffer);
335
- CRYPTO_BUFFER_free(buffer);
336
- return ok;
337
- }
338
-
339
- int SSL_use_certificate_ASN1(SSL *ssl, const uint8_t *der, size_t der_len) {
340
- CRYPTO_BUFFER *buffer = CRYPTO_BUFFER_new(der, der_len, NULL);
341
- if (buffer == NULL) {
299
+ if (privkey != NULL && privkey_method != NULL) {
300
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_HAVE_BOTH_PRIVKEY_AND_METHOD);
342
301
  return 0;
343
302
  }
344
303
 
345
- const int ok = ssl_set_cert(ssl->cert, buffer);
346
- CRYPTO_BUFFER_free(buffer);
347
- return ok;
348
- }
349
-
350
- int ssl_verify_cert_chain(SSL *ssl, long *out_verify_result,
351
- STACK_OF(X509) *cert_chain) {
352
- if (cert_chain == NULL || sk_X509_num(cert_chain) == 0) {
353
- return 0;
354
- }
355
-
356
- X509_STORE *verify_store = ssl->ctx->cert_store;
357
- if (ssl->cert->verify_store != NULL) {
358
- verify_store = ssl->cert->verify_store;
304
+ switch (check_leaf_cert_and_privkey(certs[0], privkey)) {
305
+ case leaf_cert_and_privkey_error:
306
+ return 0;
307
+ case leaf_cert_and_privkey_mismatch:
308
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CERTIFICATE_AND_PRIVATE_KEY_MISMATCH);
309
+ return 0;
310
+ case leaf_cert_and_privkey_ok:
311
+ break;
359
312
  }
360
313
 
361
- X509 *leaf = sk_X509_value(cert_chain, 0);
362
- int ret = 0;
363
- X509_STORE_CTX ctx;
364
- if (!X509_STORE_CTX_init(&ctx, verify_store, leaf, cert_chain)) {
365
- OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
314
+ STACK_OF(CRYPTO_BUFFER) *certs_sk = sk_CRYPTO_BUFFER_new_null();
315
+ if (certs_sk == NULL) {
366
316
  return 0;
367
317
  }
368
- if (!X509_STORE_CTX_set_ex_data(&ctx, SSL_get_ex_data_X509_STORE_CTX_idx(),
369
- ssl)) {
370
- goto err;
371
- }
372
-
373
- /* We need to inherit the verify parameters. These can be determined by the
374
- * context: if its a server it will verify SSL client certificates or vice
375
- * versa. */
376
- X509_STORE_CTX_set_default(&ctx, ssl->server ? "ssl_client" : "ssl_server");
377
-
378
- /* Anything non-default in "param" should overwrite anything in the ctx. */
379
- X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(&ctx), ssl->param);
380
318
 
381
- if (ssl->verify_callback) {
382
- X509_STORE_CTX_set_verify_cb(&ctx, ssl->verify_callback);
383
- }
384
-
385
- int verify_ret;
386
- if (ssl->ctx->app_verify_callback != NULL) {
387
- verify_ret = ssl->ctx->app_verify_callback(&ctx, ssl->ctx->app_verify_arg);
388
- } else {
389
- verify_ret = X509_verify_cert(&ctx);
390
- }
391
-
392
- *out_verify_result = ctx.error;
393
-
394
- /* If |SSL_VERIFY_NONE|, the error is non-fatal, but we keep the result. */
395
- if (verify_ret <= 0 && ssl->verify_mode != SSL_VERIFY_NONE) {
396
- ssl3_send_alert(ssl, SSL3_AL_FATAL, ssl_verify_alarm_type(ctx.error));
397
- OPENSSL_PUT_ERROR(SSL, SSL_R_CERTIFICATE_VERIFY_FAILED);
398
- goto err;
399
- }
400
-
401
- ERR_clear_error();
402
- ret = 1;
403
-
404
- err:
405
- X509_STORE_CTX_cleanup(&ctx);
406
- return ret;
407
- }
408
-
409
- static void set_client_CA_list(STACK_OF(X509_NAME) **ca_list,
410
- STACK_OF(X509_NAME) *name_list) {
411
- sk_X509_NAME_pop_free(*ca_list, X509_NAME_free);
412
- *ca_list = name_list;
413
- }
414
-
415
- STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *list) {
416
- STACK_OF(X509_NAME) *ret = sk_X509_NAME_new_null();
417
- if (ret == NULL) {
418
- return NULL;
419
- }
420
-
421
- for (size_t i = 0; i < sk_X509_NAME_num(list); i++) {
422
- X509_NAME *name = X509_NAME_dup(sk_X509_NAME_value(list, i));
423
- if (name == NULL || !sk_X509_NAME_push(ret, name)) {
424
- X509_NAME_free(name);
425
- sk_X509_NAME_pop_free(ret, X509_NAME_free);
426
- return NULL;
319
+ for (size_t i = 0; i < num_certs; i++) {
320
+ if (!sk_CRYPTO_BUFFER_push(certs_sk, certs[i])) {
321
+ sk_CRYPTO_BUFFER_pop_free(certs_sk, CRYPTO_BUFFER_free);
322
+ return 0;
427
323
  }
324
+ CRYPTO_BUFFER_up_ref(certs[i]);
428
325
  }
429
326
 
430
- return ret;
431
- }
432
-
433
- void SSL_set_client_CA_list(SSL *ssl, STACK_OF(X509_NAME) *name_list) {
434
- set_client_CA_list(&ssl->client_CA, name_list);
435
- }
327
+ EVP_PKEY_free(cert->privatekey);
328
+ cert->privatekey = privkey;
329
+ if (privkey != NULL) {
330
+ EVP_PKEY_up_ref(privkey);
331
+ }
332
+ cert->key_method = privkey_method;
436
333
 
437
- void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list) {
438
- set_client_CA_list(&ctx->client_CA, name_list);
439
- }
334
+ sk_CRYPTO_BUFFER_pop_free(cert->chain, CRYPTO_BUFFER_free);
335
+ cert->chain = certs_sk;
440
336
 
441
- STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx) {
442
- return ctx->client_CA;
337
+ return 1;
443
338
  }
444
339
 
445
- STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *ssl) {
446
- /* For historical reasons, this function is used both to query configuration
447
- * state on a server as well as handshake state on a client. However, whether
448
- * |ssl| is a client or server is not known until explicitly configured with
449
- * |SSL_set_connect_state|. If |handshake_func| is NULL, |ssl| is in an
450
- * indeterminate mode and |ssl->server| is unset. */
451
- if (ssl->handshake_func != NULL && !ssl->server) {
452
- if (ssl->s3->hs != NULL) {
453
- return ssl->s3->hs->ca_names;
454
- }
455
-
456
- return NULL;
457
- }
458
-
459
- if (ssl->client_CA != NULL) {
460
- return ssl->client_CA;
340
+ int ssl_set_cert(CERT *cert, UniquePtr<CRYPTO_BUFFER> buffer) {
341
+ switch (check_leaf_cert_and_privkey(buffer.get(), cert->privatekey)) {
342
+ case leaf_cert_and_privkey_error:
343
+ return 0;
344
+ case leaf_cert_and_privkey_mismatch:
345
+ // don't fail for a cert/key mismatch, just free current private key
346
+ // (when switching to a different cert & key, first this function should
347
+ // be used, then |ssl_set_pkey|.
348
+ EVP_PKEY_free(cert->privatekey);
349
+ cert->privatekey = NULL;
350
+ break;
351
+ case leaf_cert_and_privkey_ok:
352
+ break;
461
353
  }
462
- return ssl->ctx->client_CA;
463
- }
464
354
 
465
- static int add_client_CA(STACK_OF(X509_NAME) **sk, X509 *x509) {
466
- X509_NAME *name;
355
+ cert->x509_method->cert_flush_cached_leaf(cert);
467
356
 
468
- if (x509 == NULL) {
469
- return 0;
470
- }
471
- if (*sk == NULL) {
472
- *sk = sk_X509_NAME_new_null();
473
- if (*sk == NULL) {
474
- return 0;
475
- }
357
+ if (cert->chain != NULL) {
358
+ CRYPTO_BUFFER_free(sk_CRYPTO_BUFFER_value(cert->chain, 0));
359
+ sk_CRYPTO_BUFFER_set(cert->chain, 0, buffer.release());
360
+ return 1;
476
361
  }
477
362
 
478
- name = X509_NAME_dup(X509_get_subject_name(x509));
479
- if (name == NULL) {
363
+ cert->chain = sk_CRYPTO_BUFFER_new_null();
364
+ if (cert->chain == NULL) {
480
365
  return 0;
481
366
  }
482
367
 
483
- if (!sk_X509_NAME_push(*sk, name)) {
484
- X509_NAME_free(name);
368
+ if (!PushToStack(cert->chain, std::move(buffer))) {
369
+ sk_CRYPTO_BUFFER_free(cert->chain);
370
+ cert->chain = NULL;
485
371
  return 0;
486
372
  }
487
373
 
488
374
  return 1;
489
375
  }
490
376
 
491
- int SSL_add_client_CA(SSL *ssl, X509 *x509) {
492
- return add_client_CA(&ssl->client_CA, x509);
493
- }
494
-
495
- int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x509) {
496
- return add_client_CA(&ctx->client_CA, x509);
497
- }
498
-
499
377
  int ssl_has_certificate(const SSL *ssl) {
500
378
  return ssl->cert->chain != NULL &&
501
379
  sk_CRYPTO_BUFFER_value(ssl->cert->chain, 0) != NULL &&
502
380
  ssl_has_private_key(ssl);
503
381
  }
504
382
 
505
- STACK_OF(CRYPTO_BUFFER) *ssl_parse_cert_chain(uint8_t *out_alert,
506
- EVP_PKEY **out_pubkey,
507
- uint8_t *out_leaf_sha256,
508
- CBS *cbs,
509
- CRYPTO_BUFFER_POOL *pool) {
510
- *out_pubkey = NULL;
511
-
512
- STACK_OF(CRYPTO_BUFFER) *ret = sk_CRYPTO_BUFFER_new_null();
513
- if (ret == NULL) {
514
- *out_alert = SSL_AD_INTERNAL_ERROR;
515
- OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
516
- return NULL;
517
- }
383
+ bool ssl_parse_cert_chain(uint8_t *out_alert,
384
+ UniquePtr<STACK_OF(CRYPTO_BUFFER)> *out_chain,
385
+ UniquePtr<EVP_PKEY> *out_pubkey,
386
+ uint8_t *out_leaf_sha256, CBS *cbs,
387
+ CRYPTO_BUFFER_POOL *pool) {
388
+ out_chain->reset();
389
+ out_pubkey->reset();
518
390
 
519
391
  CBS certificate_list;
520
392
  if (!CBS_get_u24_length_prefixed(cbs, &certificate_list)) {
521
393
  *out_alert = SSL_AD_DECODE_ERROR;
522
394
  OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
523
- goto err;
395
+ return false;
524
396
  }
525
397
 
398
+ if (CBS_len(&certificate_list) == 0) {
399
+ return true;
400
+ }
401
+
402
+ UniquePtr<STACK_OF(CRYPTO_BUFFER)> chain(sk_CRYPTO_BUFFER_new_null());
403
+ if (!chain) {
404
+ *out_alert = SSL_AD_INTERNAL_ERROR;
405
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
406
+ return false;
407
+ }
408
+
409
+ UniquePtr<EVP_PKEY> pubkey;
526
410
  while (CBS_len(&certificate_list) > 0) {
527
411
  CBS certificate;
528
412
  if (!CBS_get_u24_length_prefixed(&certificate_list, &certificate) ||
529
413
  CBS_len(&certificate) == 0) {
530
414
  *out_alert = SSL_AD_DECODE_ERROR;
531
415
  OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_LENGTH_MISMATCH);
532
- goto err;
416
+ return false;
533
417
  }
534
418
 
535
- if (sk_CRYPTO_BUFFER_num(ret) == 0) {
536
- *out_pubkey = ssl_cert_parse_pubkey(&certificate);
537
- if (*out_pubkey == NULL) {
419
+ if (sk_CRYPTO_BUFFER_num(chain.get()) == 0) {
420
+ pubkey = ssl_cert_parse_pubkey(&certificate);
421
+ if (!pubkey) {
538
422
  *out_alert = SSL_AD_DECODE_ERROR;
539
- goto err;
423
+ return false;
540
424
  }
541
425
 
542
- /* Retain the hash of the leaf certificate if requested. */
426
+ // Retain the hash of the leaf certificate if requested.
543
427
  if (out_leaf_sha256 != NULL) {
544
428
  SHA256(CBS_data(&certificate), CBS_len(&certificate), out_leaf_sha256);
545
429
  }
546
430
  }
547
431
 
548
- CRYPTO_BUFFER *buf =
549
- CRYPTO_BUFFER_new_from_CBS(&certificate, pool);
550
- if (buf == NULL) {
551
- *out_alert = SSL_AD_DECODE_ERROR;
552
- goto err;
553
- }
554
-
555
- if (!sk_CRYPTO_BUFFER_push(ret, buf)) {
432
+ UniquePtr<CRYPTO_BUFFER> buf(
433
+ CRYPTO_BUFFER_new_from_CBS(&certificate, pool));
434
+ if (!buf ||
435
+ !PushToStack(chain.get(), std::move(buf))) {
556
436
  *out_alert = SSL_AD_INTERNAL_ERROR;
557
- CRYPTO_BUFFER_free(buf);
558
437
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
559
- goto err;
438
+ return false;
560
439
  }
561
440
  }
562
441
 
563
- return ret;
564
-
565
- err:
566
- EVP_PKEY_free(*out_pubkey);
567
- *out_pubkey = NULL;
568
- sk_CRYPTO_BUFFER_pop_free(ret, CRYPTO_BUFFER_free);
569
- return NULL;
442
+ *out_chain = std::move(chain);
443
+ *out_pubkey = std::move(pubkey);
444
+ return true;
570
445
  }
571
446
 
572
447
  int ssl_add_cert_chain(SSL *ssl, CBB *cbb) {
@@ -576,7 +451,8 @@ int ssl_add_cert_chain(SSL *ssl, CBB *cbb) {
576
451
 
577
452
  CBB certs;
578
453
  if (!CBB_add_u24_length_prefixed(cbb, &certs)) {
579
- goto err;
454
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
455
+ return 0;
580
456
  }
581
457
 
582
458
  STACK_OF(CRYPTO_BUFFER) *chain = ssl->cert->chain;
@@ -587,20 +463,17 @@ int ssl_add_cert_chain(SSL *ssl, CBB *cbb) {
587
463
  !CBB_add_bytes(&child, CRYPTO_BUFFER_data(buffer),
588
464
  CRYPTO_BUFFER_len(buffer)) ||
589
465
  !CBB_flush(&certs)) {
590
- goto err;
466
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
467
+ return 0;
591
468
  }
592
469
  }
593
470
 
594
471
  return CBB_flush(cbb);
595
-
596
- err:
597
- OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
598
- return 0;
599
472
  }
600
473
 
601
- /* ssl_cert_skip_to_spki parses a DER-encoded, X.509 certificate from |in| and
602
- * positions |*out_tbs_cert| to cover the TBSCertificate, starting at the
603
- * subjectPublicKeyInfo. */
474
+ // ssl_cert_skip_to_spki parses a DER-encoded, X.509 certificate from |in| and
475
+ // positions |*out_tbs_cert| to cover the TBSCertificate, starting at the
476
+ // subjectPublicKeyInfo.
604
477
  static int ssl_cert_skip_to_spki(const CBS *in, CBS *out_tbs_cert) {
605
478
  /* From RFC 5280, section 4.1
606
479
  * Certificate ::= SEQUENCE {
@@ -623,19 +496,19 @@ static int ssl_cert_skip_to_spki(const CBS *in, CBS *out_tbs_cert) {
623
496
  if (!CBS_get_asn1(&buf, &toplevel, CBS_ASN1_SEQUENCE) ||
624
497
  CBS_len(&buf) != 0 ||
625
498
  !CBS_get_asn1(&toplevel, out_tbs_cert, CBS_ASN1_SEQUENCE) ||
626
- /* version */
499
+ // version
627
500
  !CBS_get_optional_asn1(
628
501
  out_tbs_cert, NULL, NULL,
629
502
  CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 0) ||
630
- /* serialNumber */
503
+ // serialNumber
631
504
  !CBS_get_asn1(out_tbs_cert, NULL, CBS_ASN1_INTEGER) ||
632
- /* signature algorithm */
505
+ // signature algorithm
633
506
  !CBS_get_asn1(out_tbs_cert, NULL, CBS_ASN1_SEQUENCE) ||
634
- /* issuer */
507
+ // issuer
635
508
  !CBS_get_asn1(out_tbs_cert, NULL, CBS_ASN1_SEQUENCE) ||
636
- /* validity */
509
+ // validity
637
510
  !CBS_get_asn1(out_tbs_cert, NULL, CBS_ASN1_SEQUENCE) ||
638
- /* subject */
511
+ // subject
639
512
  !CBS_get_asn1(out_tbs_cert, NULL, CBS_ASN1_SEQUENCE)) {
640
513
  return 0;
641
514
  }
@@ -643,18 +516,24 @@ static int ssl_cert_skip_to_spki(const CBS *in, CBS *out_tbs_cert) {
643
516
  return 1;
644
517
  }
645
518
 
646
- EVP_PKEY *ssl_cert_parse_pubkey(const CBS *in) {
519
+ UniquePtr<EVP_PKEY> ssl_cert_parse_pubkey(const CBS *in) {
647
520
  CBS buf = *in, tbs_cert;
648
521
  if (!ssl_cert_skip_to_spki(&buf, &tbs_cert)) {
649
522
  OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_PARSE_LEAF_CERT);
650
- return NULL;
523
+ return nullptr;
651
524
  }
652
525
 
653
- return EVP_parse_public_key(&tbs_cert);
526
+ return UniquePtr<EVP_PKEY>(EVP_parse_public_key(&tbs_cert));
654
527
  }
655
528
 
656
529
  int ssl_compare_public_and_private_key(const EVP_PKEY *pubkey,
657
530
  const EVP_PKEY *privkey) {
531
+ if (EVP_PKEY_is_opaque(privkey)) {
532
+ // We cannot check an opaque private key and have to trust that it
533
+ // matches.
534
+ return 1;
535
+ }
536
+
658
537
  int ret = 0;
659
538
 
660
539
  switch (EVP_PKEY_cmp(pubkey, privkey)) {
@@ -669,6 +548,7 @@ int ssl_compare_public_and_private_key(const EVP_PKEY *pubkey,
669
548
  break;
670
549
  case -2:
671
550
  OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_KEY_TYPE);
551
+ break;
672
552
  default:
673
553
  assert(0);
674
554
  break;
@@ -691,15 +571,13 @@ int ssl_cert_check_private_key(const CERT *cert, const EVP_PKEY *privkey) {
691
571
 
692
572
  CBS cert_cbs;
693
573
  CRYPTO_BUFFER_init_CBS(sk_CRYPTO_BUFFER_value(cert->chain, 0), &cert_cbs);
694
- EVP_PKEY *pubkey = ssl_cert_parse_pubkey(&cert_cbs);
574
+ UniquePtr<EVP_PKEY> pubkey = ssl_cert_parse_pubkey(&cert_cbs);
695
575
  if (!pubkey) {
696
576
  OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_KEY_TYPE);
697
577
  return 0;
698
578
  }
699
579
 
700
- const int ok = ssl_compare_public_and_private_key(pubkey, privkey);
701
- EVP_PKEY_free(pubkey);
702
- return ok;
580
+ return ssl_compare_public_and_private_key(pubkey.get(), privkey);
703
581
  }
704
582
 
705
583
  int ssl_cert_check_digital_signature_key_usage(const CBS *in) {
@@ -708,20 +586,21 @@ int ssl_cert_check_digital_signature_key_usage(const CBS *in) {
708
586
  CBS tbs_cert, outer_extensions;
709
587
  int has_extensions;
710
588
  if (!ssl_cert_skip_to_spki(&buf, &tbs_cert) ||
711
- /* subjectPublicKeyInfo */
589
+ // subjectPublicKeyInfo
712
590
  !CBS_get_asn1(&tbs_cert, NULL, CBS_ASN1_SEQUENCE) ||
713
- /* issuerUniqueID */
591
+ // issuerUniqueID
714
592
  !CBS_get_optional_asn1(
715
593
  &tbs_cert, NULL, NULL,
716
594
  CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 1) ||
717
- /* subjectUniqueID */
595
+ // subjectUniqueID
718
596
  !CBS_get_optional_asn1(
719
597
  &tbs_cert, NULL, NULL,
720
598
  CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 2) ||
721
599
  !CBS_get_optional_asn1(
722
600
  &tbs_cert, &outer_extensions, &has_extensions,
723
601
  CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 3)) {
724
- goto parse_err;
602
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_PARSE_LEAF_CERT);
603
+ return 0;
725
604
  }
726
605
 
727
606
  if (!has_extensions) {
@@ -730,7 +609,8 @@ int ssl_cert_check_digital_signature_key_usage(const CBS *in) {
730
609
 
731
610
  CBS extensions;
732
611
  if (!CBS_get_asn1(&outer_extensions, &extensions, CBS_ASN1_SEQUENCE)) {
733
- goto parse_err;
612
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_PARSE_LEAF_CERT);
613
+ return 0;
734
614
  }
735
615
 
736
616
  while (CBS_len(&extensions) > 0) {
@@ -741,7 +621,8 @@ int ssl_cert_check_digital_signature_key_usage(const CBS *in) {
741
621
  !CBS_get_asn1(&extension, NULL, CBS_ASN1_BOOLEAN)) ||
742
622
  !CBS_get_asn1(&extension, &contents, CBS_ASN1_OCTETSTRING) ||
743
623
  CBS_len(&extension) != 0) {
744
- goto parse_err;
624
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_PARSE_LEAF_CERT);
625
+ return 0;
745
626
  }
746
627
 
747
628
  static const uint8_t kKeyUsageOID[3] = {0x55, 0x1d, 0x0f};
@@ -754,13 +635,15 @@ int ssl_cert_check_digital_signature_key_usage(const CBS *in) {
754
635
  CBS bit_string;
755
636
  if (!CBS_get_asn1(&contents, &bit_string, CBS_ASN1_BITSTRING) ||
756
637
  CBS_len(&contents) != 0) {
757
- goto parse_err;
638
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_PARSE_LEAF_CERT);
639
+ return 0;
758
640
  }
759
641
 
760
- /* This is the KeyUsage extension. See
761
- * https://tools.ietf.org/html/rfc5280#section-4.2.1.3 */
642
+ // This is the KeyUsage extension. See
643
+ // https://tools.ietf.org/html/rfc5280#section-4.2.1.3
762
644
  if (!CBS_is_valid_asn1_bitstring(&bit_string)) {
763
- goto parse_err;
645
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_PARSE_LEAF_CERT);
646
+ return 0;
764
647
  }
765
648
 
766
649
  if (!CBS_asn1_bitstring_has_bit(&bit_string, 0)) {
@@ -771,33 +654,27 @@ int ssl_cert_check_digital_signature_key_usage(const CBS *in) {
771
654
  return 1;
772
655
  }
773
656
 
774
- /* No KeyUsage extension found. */
657
+ // No KeyUsage extension found.
775
658
  return 1;
776
-
777
- parse_err:
778
- OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_PARSE_LEAF_CERT);
779
- return 0;
780
659
  }
781
660
 
782
- static int ca_dn_cmp(const X509_NAME **a, const X509_NAME **b) {
783
- return X509_NAME_cmp(*a, *b);
784
- }
661
+ UniquePtr<STACK_OF(CRYPTO_BUFFER)> ssl_parse_client_CA_list(SSL *ssl,
662
+ uint8_t *out_alert,
663
+ CBS *cbs) {
664
+ CRYPTO_BUFFER_POOL *const pool = ssl->ctx->pool;
785
665
 
786
- STACK_OF(X509_NAME) *
787
- ssl_parse_client_CA_list(SSL *ssl, uint8_t *out_alert, CBS *cbs) {
788
- STACK_OF(X509_NAME) *ret = sk_X509_NAME_new(ca_dn_cmp);
789
- X509_NAME *name = NULL;
790
- if (ret == NULL) {
666
+ UniquePtr<STACK_OF(CRYPTO_BUFFER)> ret(sk_CRYPTO_BUFFER_new_null());
667
+ if (!ret) {
791
668
  *out_alert = SSL_AD_INTERNAL_ERROR;
792
669
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
793
- return NULL;
670
+ return nullptr;
794
671
  }
795
672
 
796
673
  CBS child;
797
674
  if (!CBS_get_u16_length_prefixed(cbs, &child)) {
798
675
  *out_alert = SSL_AD_DECODE_ERROR;
799
676
  OPENSSL_PUT_ERROR(SSL, SSL_R_LENGTH_MISMATCH);
800
- goto err;
677
+ return nullptr;
801
678
  }
802
679
 
803
680
  while (CBS_len(&child) > 0) {
@@ -805,33 +682,26 @@ STACK_OF(X509_NAME) *
805
682
  if (!CBS_get_u16_length_prefixed(&child, &distinguished_name)) {
806
683
  *out_alert = SSL_AD_DECODE_ERROR;
807
684
  OPENSSL_PUT_ERROR(SSL, SSL_R_CA_DN_TOO_LONG);
808
- goto err;
809
- }
810
-
811
- const uint8_t *ptr = CBS_data(&distinguished_name);
812
- /* A u16 length cannot overflow a long. */
813
- name = d2i_X509_NAME(NULL, &ptr, (long)CBS_len(&distinguished_name));
814
- if (name == NULL ||
815
- ptr != CBS_data(&distinguished_name) + CBS_len(&distinguished_name)) {
816
- *out_alert = SSL_AD_DECODE_ERROR;
817
- OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
818
- goto err;
685
+ return nullptr;
819
686
  }
820
687
 
821
- if (!sk_X509_NAME_push(ret, name)) {
688
+ UniquePtr<CRYPTO_BUFFER> buffer(
689
+ CRYPTO_BUFFER_new_from_CBS(&distinguished_name, pool));
690
+ if (!buffer ||
691
+ !PushToStack(ret.get(), std::move(buffer))) {
822
692
  *out_alert = SSL_AD_INTERNAL_ERROR;
823
693
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
824
- goto err;
694
+ return nullptr;
825
695
  }
826
- name = NULL;
827
696
  }
828
697
 
829
- return ret;
698
+ if (!ssl->ctx->x509_method->check_client_CA_list(ret.get())) {
699
+ *out_alert = SSL_AD_INTERNAL_ERROR;
700
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
701
+ return nullptr;
702
+ }
830
703
 
831
- err:
832
- X509_NAME_free(name);
833
- sk_X509_NAME_pop_free(ret, X509_NAME_free);
834
- return NULL;
704
+ return ret;
835
705
  }
836
706
 
837
707
  int ssl_add_client_CA_list(SSL *ssl, CBB *cbb) {
@@ -840,21 +710,18 @@ int ssl_add_client_CA_list(SSL *ssl, CBB *cbb) {
840
710
  return 0;
841
711
  }
842
712
 
843
- STACK_OF(X509_NAME) *sk = SSL_get_client_CA_list(ssl);
844
- if (sk == NULL) {
713
+ STACK_OF(CRYPTO_BUFFER) *names = ssl->client_CA;
714
+ if (names == NULL) {
715
+ names = ssl->ctx->client_CA;
716
+ }
717
+ if (names == NULL) {
845
718
  return CBB_flush(cbb);
846
719
  }
847
720
 
848
- for (size_t i = 0; i < sk_X509_NAME_num(sk); i++) {
849
- X509_NAME *name = sk_X509_NAME_value(sk, i);
850
- int len = i2d_X509_NAME(name, NULL);
851
- if (len < 0) {
852
- return 0;
853
- }
854
- uint8_t *ptr;
721
+ for (const CRYPTO_BUFFER *name : names) {
855
722
  if (!CBB_add_u16_length_prefixed(&child, &name_cbb) ||
856
- !CBB_add_space(&name_cbb, &ptr, (size_t)len) ||
857
- (len > 0 && i2d_X509_NAME(name, &ptr) < 0)) {
723
+ !CBB_add_bytes(&name_cbb, CRYPTO_BUFFER_data(name),
724
+ CRYPTO_BUFFER_len(name))) {
858
725
  return 0;
859
726
  }
860
727
  }
@@ -862,71 +729,34 @@ int ssl_add_client_CA_list(SSL *ssl, CBB *cbb) {
862
729
  return CBB_flush(cbb);
863
730
  }
864
731
 
865
- static int set_cert_store(X509_STORE **store_ptr, X509_STORE *new_store, int take_ref) {
866
- X509_STORE_free(*store_ptr);
867
- *store_ptr = new_store;
868
-
869
- if (new_store != NULL && take_ref) {
870
- X509_STORE_up_ref(new_store);
871
- }
872
-
873
- return 1;
874
- }
875
-
876
- int SSL_CTX_set0_verify_cert_store(SSL_CTX *ctx, X509_STORE *store) {
877
- return set_cert_store(&ctx->cert->verify_store, store, 0);
878
- }
879
-
880
- int SSL_CTX_set1_verify_cert_store(SSL_CTX *ctx, X509_STORE *store) {
881
- return set_cert_store(&ctx->cert->verify_store, store, 1);
882
- }
883
-
884
- int SSL_set0_verify_cert_store(SSL *ssl, X509_STORE *store) {
885
- return set_cert_store(&ssl->cert->verify_store, store, 0);
886
- }
887
-
888
- int SSL_set1_verify_cert_store(SSL *ssl, X509_STORE *store) {
889
- return set_cert_store(&ssl->cert->verify_store, store, 1);
890
- }
891
-
892
- void SSL_CTX_set_cert_cb(SSL_CTX *ctx, int (*cb)(SSL *ssl, void *arg),
893
- void *arg) {
894
- ssl_cert_set_cert_cb(ctx->cert, cb, arg);
895
- }
896
-
897
- void SSL_set_cert_cb(SSL *ssl, int (*cb)(SSL *ssl, void *arg), void *arg) {
898
- ssl_cert_set_cert_cb(ssl->cert, cb, arg);
899
- }
900
-
901
732
  int ssl_check_leaf_certificate(SSL_HANDSHAKE *hs, EVP_PKEY *pkey,
902
733
  const CRYPTO_BUFFER *leaf) {
903
734
  SSL *const ssl = hs->ssl;
904
735
  assert(ssl3_protocol_version(ssl) < TLS1_3_VERSION);
905
736
 
906
- /* Check the certificate's type matches the cipher. */
907
- int expected_type = ssl_cipher_get_key_type(hs->new_cipher);
908
- assert(expected_type != EVP_PKEY_NONE);
909
- if (pkey->type != expected_type) {
737
+ // Check the certificate's type matches the cipher.
738
+ if (!(hs->new_cipher->algorithm_auth & ssl_cipher_auth_mask_for_key(pkey))) {
910
739
  OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CERTIFICATE_TYPE);
911
740
  return 0;
912
741
  }
913
742
 
914
- if (hs->new_cipher->algorithm_auth & SSL_aECDSA) {
743
+ // Check key usages for all key types but RSA. This is needed to distinguish
744
+ // ECDH certificates, which we do not support, from ECDSA certificates. In
745
+ // principle, we should check RSA key usages based on cipher, but this breaks
746
+ // buggy antivirus deployments. Other key types are always used for signing.
747
+ //
748
+ // TODO(davidben): Get more recent data on RSA key usages.
749
+ if (EVP_PKEY_id(pkey) != EVP_PKEY_RSA) {
915
750
  CBS leaf_cbs;
916
751
  CBS_init(&leaf_cbs, CRYPTO_BUFFER_data(leaf), CRYPTO_BUFFER_len(leaf));
917
- /* ECDSA and ECDH certificates use the same public key format. Instead,
918
- * they are distinguished by the key usage extension in the certificate. */
919
752
  if (!ssl_cert_check_digital_signature_key_usage(&leaf_cbs)) {
920
753
  return 0;
921
754
  }
755
+ }
922
756
 
757
+ if (EVP_PKEY_id(pkey) == EVP_PKEY_EC) {
758
+ // Check the key's group and point format are acceptable.
923
759
  EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(pkey);
924
- if (ec_key == NULL) {
925
- OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECC_CERT);
926
- return 0;
927
- }
928
-
929
- /* Check the key's group and point format are acceptable. */
930
760
  uint16_t group_id;
931
761
  if (!ssl_nid_to_group_id(
932
762
  &group_id, EC_GROUP_get_curve_name(EC_KEY_get0_group(ec_key))) ||
@@ -940,36 +770,84 @@ int ssl_check_leaf_certificate(SSL_HANDSHAKE *hs, EVP_PKEY *pkey,
940
770
  return 1;
941
771
  }
942
772
 
943
- static int do_client_cert_cb(SSL *ssl, void *arg) {
944
- if (ssl_has_certificate(ssl) || ssl->ctx->client_cert_cb == NULL) {
773
+ int ssl_on_certificate_selected(SSL_HANDSHAKE *hs) {
774
+ SSL *const ssl = hs->ssl;
775
+ if (!ssl_has_certificate(ssl)) {
776
+ // Nothing to do.
945
777
  return 1;
946
778
  }
947
779
 
948
- X509 *x509 = NULL;
949
- EVP_PKEY *pkey = NULL;
950
- int ret = ssl->ctx->client_cert_cb(ssl, &x509, &pkey);
951
- if (ret < 0) {
952
- return -1;
780
+ if (!ssl->ctx->x509_method->ssl_auto_chain_if_needed(ssl)) {
781
+ return 0;
953
782
  }
954
783
 
955
- if (ret != 0) {
956
- if (!SSL_use_certificate(ssl, x509) ||
957
- !SSL_use_PrivateKey(ssl, pkey)) {
958
- return 0;
959
- }
784
+ CBS leaf;
785
+ CRYPTO_BUFFER_init_CBS(sk_CRYPTO_BUFFER_value(ssl->cert->chain, 0), &leaf);
786
+
787
+ hs->local_pubkey = ssl_cert_parse_pubkey(&leaf);
788
+ return hs->local_pubkey != NULL;
789
+ }
790
+
791
+ } // namespace bssl
792
+
793
+ using namespace bssl;
794
+
795
+ int SSL_set_chain_and_key(SSL *ssl, CRYPTO_BUFFER *const *certs,
796
+ size_t num_certs, EVP_PKEY *privkey,
797
+ const SSL_PRIVATE_KEY_METHOD *privkey_method) {
798
+ return cert_set_chain_and_key(ssl->cert, certs, num_certs, privkey,
799
+ privkey_method);
800
+ }
801
+
802
+ int SSL_CTX_set_chain_and_key(SSL_CTX *ctx, CRYPTO_BUFFER *const *certs,
803
+ size_t num_certs, EVP_PKEY *privkey,
804
+ const SSL_PRIVATE_KEY_METHOD *privkey_method) {
805
+ return cert_set_chain_and_key(ctx->cert, certs, num_certs, privkey,
806
+ privkey_method);
807
+ }
808
+
809
+ int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, size_t der_len,
810
+ const uint8_t *der) {
811
+ UniquePtr<CRYPTO_BUFFER> buffer(CRYPTO_BUFFER_new(der, der_len, NULL));
812
+ if (!buffer) {
813
+ return 0;
960
814
  }
961
815
 
962
- X509_free(x509);
963
- EVP_PKEY_free(pkey);
964
- return 1;
816
+ return ssl_set_cert(ctx->cert, std::move(buffer));
817
+ }
818
+
819
+ int SSL_use_certificate_ASN1(SSL *ssl, const uint8_t *der, size_t der_len) {
820
+ UniquePtr<CRYPTO_BUFFER> buffer(CRYPTO_BUFFER_new(der, der_len, NULL));
821
+ if (!buffer) {
822
+ return 0;
823
+ }
824
+
825
+ return ssl_set_cert(ssl->cert, std::move(buffer));
826
+ }
827
+
828
+ void SSL_CTX_set_cert_cb(SSL_CTX *ctx, int (*cb)(SSL *ssl, void *arg),
829
+ void *arg) {
830
+ ssl_cert_set_cert_cb(ctx->cert, cb, arg);
965
831
  }
966
832
 
967
- void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, int (*cb)(SSL *ssl,
968
- X509 **out_x509,
969
- EVP_PKEY **out_pkey)) {
970
- /* Emulate the old client certificate callback with the new one. */
971
- SSL_CTX_set_cert_cb(ctx, do_client_cert_cb, NULL);
972
- ctx->client_cert_cb = cb;
833
+ void SSL_set_cert_cb(SSL *ssl, int (*cb)(SSL *ssl, void *arg), void *arg) {
834
+ ssl_cert_set_cert_cb(ssl->cert, cb, arg);
835
+ }
836
+
837
+ STACK_OF(CRYPTO_BUFFER) *SSL_get0_peer_certificates(const SSL *ssl) {
838
+ SSL_SESSION *session = SSL_get_session(ssl);
839
+ if (session == NULL) {
840
+ return NULL;
841
+ }
842
+
843
+ return session->certs;
844
+ }
845
+
846
+ STACK_OF(CRYPTO_BUFFER) *SSL_get0_server_requested_CAs(const SSL *ssl) {
847
+ if (ssl->s3->hs == NULL) {
848
+ return NULL;
849
+ }
850
+ return ssl->s3->hs->ca_names.get();
973
851
  }
974
852
 
975
853
  static int set_signed_cert_timestamp_list(CERT *cert, const uint8_t *list,
@@ -1010,3 +888,15 @@ int SSL_set_ocsp_response(SSL *ssl, const uint8_t *response,
1010
888
  ssl->cert->ocsp_response = CRYPTO_BUFFER_new(response, response_len, NULL);
1011
889
  return ssl->cert->ocsp_response != NULL;
1012
890
  }
891
+
892
+ void SSL_CTX_set0_client_CAs(SSL_CTX *ctx, STACK_OF(CRYPTO_BUFFER) *name_list) {
893
+ ctx->x509_method->ssl_ctx_flush_cached_client_CA(ctx);
894
+ sk_CRYPTO_BUFFER_pop_free(ctx->client_CA, CRYPTO_BUFFER_free);
895
+ ctx->client_CA = name_list;
896
+ }
897
+
898
+ void SSL_set0_client_CAs(SSL *ssl, STACK_OF(CRYPTO_BUFFER) *name_list) {
899
+ ssl->ctx->x509_method->ssl_flush_cached_client_CA(ssl);
900
+ sk_CRYPTO_BUFFER_pop_free(ssl->client_CA, CRYPTO_BUFFER_free);
901
+ ssl->client_CA = name_list;
902
+ }