grpc 1.24.0 → 1.25.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 (504) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +306 -243
  3. data/etc/roots.pem +0 -100
  4. data/include/grpc/grpc_security.h +44 -18
  5. data/include/grpc/impl/codegen/grpc_types.h +15 -0
  6. data/include/grpc/impl/codegen/port_platform.h +27 -11
  7. data/include/grpc/impl/codegen/sync_generic.h +1 -1
  8. data/src/boringssl/err_data.c +695 -650
  9. data/src/core/ext/filters/client_channel/client_channel.cc +257 -179
  10. data/src/core/ext/filters/client_channel/client_channel.h +24 -0
  11. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +2 -3
  12. data/src/core/ext/filters/client_channel/client_channel_factory.h +1 -5
  13. data/src/core/ext/filters/client_channel/health/health_check_client.cc +18 -45
  14. data/src/core/ext/filters/client_channel/health/health_check_client.h +5 -13
  15. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -3
  17. data/src/core/ext/filters/client_channel/lb_policy.h +65 -55
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +14 -14
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +113 -36
  20. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +14 -19
  21. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +36 -13
  22. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +3 -10
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +814 -1589
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +2 -5
  25. data/src/core/ext/filters/client_channel/lb_policy_factory.h +3 -6
  26. data/src/core/ext/filters/client_channel/resolver.cc +1 -2
  27. data/src/core/ext/filters/client_channel/resolver.h +8 -16
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +25 -8
  29. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +46 -12
  30. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +10 -17
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +7 -8
  32. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  33. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +111 -44
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +22 -14
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  37. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +29 -10
  38. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +27 -36
  39. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +7 -10
  40. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +60 -16
  41. data/src/core/ext/filters/client_channel/resolver_factory.h +4 -8
  42. data/src/core/ext/filters/client_channel/resolver_registry.cc +1 -1
  43. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -10
  45. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +1 -1
  47. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -5
  48. data/src/core/ext/filters/client_channel/retry_throttle.h +1 -4
  49. data/src/core/ext/filters/client_channel/service_config.h +8 -8
  50. data/src/core/ext/filters/client_channel/subchannel.cc +53 -86
  51. data/src/core/ext/filters/client_channel/subchannel.h +7 -9
  52. data/src/core/ext/filters/client_channel/subchannel_interface.h +9 -13
  53. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +3 -6
  54. data/src/core/ext/filters/client_channel/{lb_policy/xds/xds_load_balancer_api.cc → xds/xds_api.cc} +169 -52
  55. data/src/core/ext/filters/client_channel/xds/xds_api.h +171 -0
  56. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +450 -0
  57. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +99 -0
  58. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_channel.h +8 -6
  59. data/src/core/ext/filters/client_channel/xds/xds_channel_args.h +26 -0
  60. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_channel_secure.cc +28 -11
  61. data/src/core/ext/filters/client_channel/xds/xds_client.cc +1413 -0
  62. data/src/core/ext/filters/client_channel/xds/xds_client.h +221 -0
  63. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_client_stats.cc +1 -5
  64. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_client_stats.h +3 -4
  65. data/src/core/ext/filters/deadline/deadline_filter.cc +20 -20
  66. data/src/core/ext/filters/http/client/http_client_filter.cc +15 -15
  67. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  68. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +12 -12
  69. data/src/core/ext/filters/max_age/max_age_filter.cc +59 -50
  70. data/src/core/ext/filters/message_size/message_size_filter.cc +18 -18
  71. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +15 -14
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +233 -175
  73. data/src/core/ext/transport/chttp2/transport/flow_control.h +21 -24
  74. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +253 -163
  75. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +24 -12
  76. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -3
  77. data/src/core/ext/transport/chttp2/transport/internal.h +13 -15
  78. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -0
  79. data/src/core/ext/transport/inproc/inproc_transport.cc +20 -13
  80. data/src/core/lib/channel/channel_args.cc +16 -0
  81. data/src/core/lib/channel/channel_args.h +22 -0
  82. data/src/core/lib/channel/channelz.cc +5 -6
  83. data/src/core/lib/channel/channelz.h +1 -1
  84. data/src/core/lib/channel/connected_channel.cc +20 -20
  85. data/src/core/lib/channel/handshaker.h +3 -4
  86. data/src/core/lib/channel/handshaker_factory.h +1 -3
  87. data/src/core/lib/debug/trace.h +3 -2
  88. data/src/core/lib/gprpp/arena.cc +3 -3
  89. data/src/core/lib/gprpp/arena.h +2 -3
  90. data/src/core/lib/gprpp/inlined_vector.h +9 -0
  91. data/src/core/lib/gprpp/map.h +3 -501
  92. data/src/core/lib/gprpp/memory.h +45 -41
  93. data/src/core/lib/gprpp/mpscq.cc +108 -0
  94. data/src/core/lib/gprpp/mpscq.h +98 -0
  95. data/src/core/lib/gprpp/orphanable.h +6 -11
  96. data/src/core/lib/gprpp/ref_counted.h +25 -19
  97. data/src/core/lib/gprpp/set.h +33 -0
  98. data/src/core/lib/gprpp/thd.h +2 -4
  99. data/src/core/lib/http/httpcli.cc +1 -1
  100. data/src/core/lib/http/httpcli_security_connector.cc +15 -11
  101. data/src/core/lib/http/parser.cc +1 -1
  102. data/src/core/lib/iomgr/buffer_list.cc +4 -5
  103. data/src/core/lib/iomgr/buffer_list.h +5 -6
  104. data/src/core/lib/iomgr/call_combiner.cc +4 -5
  105. data/src/core/lib/iomgr/call_combiner.h +2 -2
  106. data/src/core/lib/iomgr/cfstream_handle.h +3 -5
  107. data/src/core/lib/iomgr/closure.h +8 -3
  108. data/src/core/lib/iomgr/combiner.cc +45 -82
  109. data/src/core/lib/iomgr/combiner.h +32 -8
  110. data/src/core/lib/iomgr/endpoint_cfstream.cc +5 -3
  111. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -15
  112. data/src/core/lib/iomgr/exec_ctx.h +4 -3
  113. data/src/core/lib/iomgr/executor.cc +4 -2
  114. data/src/core/lib/iomgr/executor.h +3 -0
  115. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -6
  116. data/src/core/lib/iomgr/executor/threadpool.cc +1 -2
  117. data/src/core/lib/iomgr/executor/threadpool.h +7 -11
  118. data/src/core/lib/iomgr/resource_quota.cc +55 -51
  119. data/src/core/lib/iomgr/resource_quota.h +13 -9
  120. data/src/core/lib/iomgr/socket_utils_common_posix.cc +13 -0
  121. data/src/core/lib/iomgr/socket_utils_posix.h +4 -0
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -11
  123. data/src/core/lib/iomgr/tcp_custom.cc +9 -7
  124. data/src/core/lib/iomgr/tcp_posix.cc +20 -16
  125. data/src/core/lib/iomgr/tcp_server.h +1 -4
  126. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
  127. data/src/core/lib/iomgr/tcp_server_posix.cc +1 -1
  128. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -11
  129. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  130. data/src/core/lib/iomgr/udp_server.cc +3 -2
  131. data/src/core/lib/iomgr/udp_server.h +6 -12
  132. data/src/core/lib/json/json.h +1 -1
  133. data/src/core/lib/json/json_string.cc +2 -2
  134. data/src/core/lib/profiling/basic_timers.cc +2 -2
  135. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -2
  136. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -1
  137. data/src/core/lib/security/credentials/credentials.h +4 -20
  138. data/src/core/lib/security/credentials/fake/fake_credentials.cc +4 -4
  139. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -3
  140. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +64 -0
  141. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +4 -4
  142. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -7
  143. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -0
  144. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -4
  145. data/src/core/lib/security/security_connector/security_connector.cc +1 -0
  146. data/src/core/lib/security/security_connector/security_connector.h +19 -17
  147. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +8 -5
  148. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  149. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  150. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +14 -6
  151. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +4 -2
  152. data/src/core/lib/security/transport/client_auth_filter.cc +17 -17
  153. data/src/core/lib/security/transport/security_handshaker.cc +29 -13
  154. data/src/core/lib/security/transport/security_handshaker.h +4 -2
  155. data/src/core/lib/security/transport/server_auth_filter.cc +14 -14
  156. data/src/core/lib/slice/slice.cc +2 -10
  157. data/src/core/lib/slice/slice_hash_table.h +4 -6
  158. data/src/core/lib/slice/slice_intern.cc +42 -39
  159. data/src/core/lib/slice/slice_internal.h +3 -3
  160. data/src/core/lib/slice/slice_utils.h +21 -4
  161. data/src/core/lib/slice/slice_weak_hash_table.h +4 -6
  162. data/src/core/lib/surface/call.cc +3 -3
  163. data/src/core/lib/surface/channel.cc +7 -0
  164. data/src/core/lib/surface/completion_queue.cc +12 -11
  165. data/src/core/lib/surface/completion_queue.h +4 -2
  166. data/src/core/lib/surface/init.cc +1 -0
  167. data/src/core/lib/surface/lame_client.cc +33 -18
  168. data/src/core/lib/surface/server.cc +77 -76
  169. data/src/core/lib/surface/version.cc +1 -1
  170. data/src/core/lib/transport/byte_stream.h +3 -7
  171. data/src/core/lib/transport/connectivity_state.cc +112 -98
  172. data/src/core/lib/transport/connectivity_state.h +100 -50
  173. data/src/core/lib/transport/static_metadata.cc +276 -288
  174. data/src/core/lib/transport/static_metadata.h +73 -76
  175. data/src/core/lib/transport/status_conversion.cc +1 -1
  176. data/src/core/lib/transport/status_metadata.cc +1 -1
  177. data/src/core/lib/transport/transport.cc +2 -2
  178. data/src/core/lib/transport/transport.h +12 -4
  179. data/src/core/lib/transport/transport_op_string.cc +14 -11
  180. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +1 -1
  181. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +1 -1
  182. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +5 -5
  183. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -2
  184. data/src/core/tsi/fake_transport_security.cc +7 -5
  185. data/src/core/tsi/grpc_shadow_boringssl.h +2918 -2627
  186. data/src/core/tsi/local_transport_security.cc +8 -6
  187. data/src/core/tsi/ssl/session_cache/ssl_session.h +1 -3
  188. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -2
  189. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +7 -5
  190. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -6
  191. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -2
  192. data/src/core/tsi/ssl_transport_security.cc +12 -12
  193. data/src/core/tsi/ssl_transport_security.h +2 -2
  194. data/src/core/tsi/transport_security_grpc.cc +7 -0
  195. data/src/core/tsi/transport_security_grpc.h +6 -0
  196. data/src/ruby/ext/grpc/extconf.rb +1 -0
  197. data/src/ruby/ext/grpc/rb_call.c +1 -1
  198. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  199. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  200. data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
  201. data/src/ruby/lib/grpc/version.rb +1 -1
  202. data/src/ruby/spec/google_rpc_status_utils_spec.rb +2 -2
  203. data/third_party/boringssl/crypto/asn1/a_bool.c +18 -5
  204. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +17 -221
  205. data/third_party/boringssl/crypto/asn1/a_dup.c +0 -24
  206. data/third_party/boringssl/crypto/asn1/a_enum.c +2 -2
  207. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +10 -72
  208. data/third_party/boringssl/crypto/asn1/a_int.c +12 -71
  209. data/third_party/boringssl/crypto/asn1/a_mbstr.c +110 -216
  210. data/third_party/boringssl/crypto/asn1/a_object.c +16 -5
  211. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  212. data/third_party/boringssl/crypto/asn1/asn1_lib.c +5 -1
  213. data/third_party/boringssl/crypto/asn1/tasn_enc.c +3 -1
  214. data/third_party/boringssl/crypto/base64/base64.c +2 -2
  215. data/third_party/boringssl/crypto/bio/bio.c +73 -9
  216. data/third_party/boringssl/crypto/bio/connect.c +4 -0
  217. data/third_party/boringssl/crypto/bio/fd.c +4 -0
  218. data/third_party/boringssl/crypto/bio/file.c +5 -2
  219. data/third_party/boringssl/crypto/bio/socket.c +4 -0
  220. data/third_party/boringssl/crypto/bio/socket_helper.c +4 -0
  221. data/third_party/boringssl/crypto/bn_extra/convert.c +11 -7
  222. data/third_party/boringssl/crypto/bytestring/ber.c +8 -4
  223. data/third_party/boringssl/crypto/bytestring/cbb.c +19 -7
  224. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -15
  225. data/third_party/boringssl/crypto/bytestring/internal.h +28 -7
  226. data/third_party/boringssl/crypto/bytestring/unicode.c +155 -0
  227. data/third_party/boringssl/crypto/chacha/chacha.c +36 -19
  228. data/third_party/boringssl/crypto/chacha/internal.h +45 -0
  229. data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +29 -0
  230. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +269 -25
  231. data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +16 -14
  232. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +54 -38
  233. data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +133 -41
  234. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +23 -15
  235. data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +24 -15
  236. data/third_party/boringssl/crypto/cmac/cmac.c +62 -25
  237. data/third_party/boringssl/crypto/conf/conf.c +7 -0
  238. data/third_party/boringssl/crypto/cpu-arm-linux.c +4 -148
  239. data/third_party/boringssl/crypto/cpu-arm-linux.h +201 -0
  240. data/third_party/boringssl/crypto/cpu-intel.c +45 -51
  241. data/third_party/boringssl/crypto/crypto.c +39 -22
  242. data/third_party/boringssl/crypto/curve25519/spake25519.c +1 -1
  243. data/third_party/boringssl/crypto/dsa/dsa.c +77 -53
  244. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +20 -8
  245. data/third_party/boringssl/crypto/ec_extra/ec_derive.c +96 -0
  246. data/third_party/boringssl/crypto/{ecdh/ecdh.c → ecdh_extra/ecdh_extra.c} +20 -58
  247. data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +1 -9
  248. data/third_party/boringssl/crypto/engine/engine.c +2 -1
  249. data/third_party/boringssl/crypto/err/err.c +2 -0
  250. data/third_party/boringssl/crypto/err/internal.h +2 -2
  251. data/third_party/boringssl/crypto/evp/evp.c +89 -8
  252. data/third_party/boringssl/crypto/evp/evp_asn1.c +56 -5
  253. data/third_party/boringssl/crypto/evp/evp_ctx.c +52 -14
  254. data/third_party/boringssl/crypto/evp/internal.h +18 -1
  255. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +5 -0
  256. data/third_party/boringssl/crypto/evp/p_ec.c +51 -3
  257. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +6 -7
  258. data/third_party/boringssl/crypto/evp/p_ed25519.c +36 -3
  259. data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +76 -45
  260. data/third_party/boringssl/crypto/evp/p_rsa.c +3 -1
  261. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +5 -0
  262. data/third_party/boringssl/crypto/evp/p_x25519.c +110 -0
  263. data/third_party/boringssl/crypto/evp/p_x25519_asn1.c +249 -0
  264. data/third_party/boringssl/crypto/evp/scrypt.c +6 -2
  265. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +34 -274
  266. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +161 -21
  267. data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +111 -13
  268. data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +17 -21
  269. data/third_party/boringssl/crypto/fipsmodule/bcm.c +119 -7
  270. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +19 -2
  271. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +2 -2
  272. data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +93 -160
  273. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +48 -57
  274. data/third_party/boringssl/crypto/fipsmodule/bn/div_extra.c +87 -0
  275. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +143 -211
  276. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +0 -305
  277. data/third_party/boringssl/crypto/fipsmodule/bn/gcd_extra.c +325 -0
  278. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +168 -50
  279. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +68 -92
  280. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +7 -6
  281. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +11 -14
  282. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +358 -443
  283. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +25 -35
  284. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +20 -25
  285. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +76 -5
  286. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +14 -14
  287. data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +7 -2
  288. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +383 -516
  289. data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +4 -0
  290. data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +3 -4
  291. data/third_party/boringssl/crypto/fipsmodule/delocate.h +3 -2
  292. data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +32 -17
  293. data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +3 -3
  294. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +228 -122
  295. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +34 -8
  296. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +311 -98
  297. data/third_party/boringssl/crypto/fipsmodule/ec/felem.c +82 -0
  298. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +263 -97
  299. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +22 -59
  300. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +317 -234
  301. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +9473 -9475
  302. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +313 -109
  303. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +36 -0
  304. data/third_party/boringssl/crypto/fipsmodule/ec/scalar.c +96 -0
  305. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +126 -792
  306. data/third_party/boringssl/crypto/fipsmodule/ec/simple_mul.c +84 -0
  307. data/third_party/boringssl/crypto/fipsmodule/ec/util.c +163 -12
  308. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +84 -211
  309. data/third_party/boringssl/crypto/fipsmodule/ecdh/ecdh.c +122 -0
  310. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +60 -205
  311. data/third_party/boringssl/crypto/fipsmodule/fips_shared_support.c +32 -0
  312. data/third_party/boringssl/crypto/fipsmodule/is_fips.c +2 -0
  313. data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +3 -1
  314. data/third_party/boringssl/crypto/fipsmodule/md5/internal.h +37 -0
  315. data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +11 -8
  316. data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +35 -79
  317. data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +7 -39
  318. data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +7 -27
  319. data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +123 -309
  320. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +189 -126
  321. data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +3 -2
  322. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +2 -2
  323. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +35 -0
  324. data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +24 -19
  325. data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +256 -77
  326. data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +10 -7
  327. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +5 -1
  328. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +131 -14
  329. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +83 -10
  330. data/third_party/boringssl/crypto/fipsmodule/sha/internal.h +53 -0
  331. data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +9 -13
  332. data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +18 -12
  333. data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +95 -168
  334. data/third_party/boringssl/crypto/hrss/hrss.c +2201 -0
  335. data/third_party/boringssl/crypto/hrss/internal.h +62 -0
  336. data/third_party/boringssl/crypto/internal.h +95 -20
  337. data/third_party/boringssl/crypto/lhash/lhash.c +45 -33
  338. data/third_party/boringssl/crypto/mem.c +39 -2
  339. data/third_party/boringssl/crypto/obj/obj.c +4 -4
  340. data/third_party/boringssl/crypto/obj/obj_dat.h +6181 -875
  341. data/third_party/boringssl/crypto/pem/pem_all.c +2 -3
  342. data/third_party/boringssl/crypto/pem/pem_info.c +144 -162
  343. data/third_party/boringssl/crypto/pem/pem_lib.c +53 -52
  344. data/third_party/boringssl/crypto/pem/pem_pkey.c +13 -21
  345. data/third_party/boringssl/crypto/pkcs7/pkcs7.c +15 -22
  346. data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +168 -16
  347. data/third_party/boringssl/crypto/pkcs8/internal.h +11 -0
  348. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +24 -15
  349. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +42 -25
  350. data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +559 -43
  351. data/third_party/boringssl/crypto/pool/internal.h +1 -1
  352. data/third_party/boringssl/crypto/pool/pool.c +21 -0
  353. data/third_party/boringssl/crypto/rand_extra/deterministic.c +8 -0
  354. data/third_party/boringssl/crypto/rand_extra/fuchsia.c +1 -14
  355. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  356. data/third_party/boringssl/crypto/rsa_extra/rsa_print.c +22 -0
  357. data/third_party/boringssl/crypto/siphash/siphash.c +80 -0
  358. data/third_party/boringssl/crypto/stack/stack.c +83 -32
  359. data/third_party/boringssl/crypto/thread_none.c +2 -2
  360. data/third_party/boringssl/crypto/thread_pthread.c +2 -2
  361. data/third_party/boringssl/crypto/thread_win.c +38 -19
  362. data/third_party/boringssl/crypto/x509/a_strex.c +22 -2
  363. data/third_party/boringssl/crypto/x509/asn1_gen.c +2 -1
  364. data/third_party/boringssl/crypto/x509/by_dir.c +7 -0
  365. data/third_party/boringssl/crypto/x509/by_file.c +12 -10
  366. data/third_party/boringssl/crypto/x509/t_crl.c +5 -8
  367. data/third_party/boringssl/crypto/x509/t_req.c +1 -3
  368. data/third_party/boringssl/crypto/x509/t_x509.c +5 -8
  369. data/third_party/boringssl/crypto/x509/x509_cmp.c +1 -1
  370. data/third_party/boringssl/crypto/x509/x509_def.c +1 -1
  371. data/third_party/boringssl/crypto/x509/x509_lu.c +114 -5
  372. data/third_party/boringssl/crypto/x509/x509_req.c +20 -0
  373. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  374. data/third_party/boringssl/crypto/x509/x509_trs.c +1 -0
  375. data/third_party/boringssl/crypto/x509/x509_txt.c +4 -5
  376. data/third_party/boringssl/crypto/x509/x509_vfy.c +145 -138
  377. data/third_party/boringssl/crypto/x509/x509_vpm.c +2 -0
  378. data/third_party/boringssl/crypto/x509/x509cset.c +40 -0
  379. data/third_party/boringssl/crypto/x509/x509name.c +2 -3
  380. data/third_party/boringssl/crypto/x509/x_all.c +109 -210
  381. data/third_party/boringssl/crypto/x509/x_x509.c +6 -0
  382. data/third_party/boringssl/crypto/x509v3/ext_dat.h +1 -3
  383. data/third_party/boringssl/crypto/x509v3/internal.h +56 -0
  384. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -0
  385. data/third_party/boringssl/crypto/x509v3/pcy_node.c +1 -0
  386. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +4 -2
  387. data/third_party/boringssl/crypto/x509v3/v3_akey.c +5 -2
  388. data/third_party/boringssl/crypto/x509v3/v3_alt.c +19 -13
  389. data/third_party/boringssl/crypto/x509v3/v3_conf.c +2 -1
  390. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +3 -2
  391. data/third_party/boringssl/crypto/x509v3/v3_genn.c +1 -6
  392. data/third_party/boringssl/crypto/x509v3/v3_lib.c +1 -0
  393. data/third_party/boringssl/crypto/x509v3/v3_ocsp.c +68 -0
  394. data/third_party/boringssl/crypto/x509v3/v3_pci.c +2 -1
  395. data/third_party/boringssl/crypto/x509v3/v3_purp.c +47 -69
  396. data/third_party/boringssl/crypto/x509v3/v3_skey.c +5 -2
  397. data/third_party/boringssl/crypto/x509v3/v3_utl.c +69 -25
  398. data/third_party/boringssl/include/openssl/aead.h +45 -19
  399. data/third_party/boringssl/include/openssl/aes.h +32 -7
  400. data/third_party/boringssl/include/openssl/asn1.h +7 -77
  401. data/third_party/boringssl/include/openssl/base.h +120 -6
  402. data/third_party/boringssl/include/openssl/base64.h +4 -1
  403. data/third_party/boringssl/include/openssl/bio.h +112 -81
  404. data/third_party/boringssl/include/openssl/blowfish.h +3 -3
  405. data/third_party/boringssl/include/openssl/bn.h +55 -29
  406. data/third_party/boringssl/include/openssl/buf.h +2 -2
  407. data/third_party/boringssl/include/openssl/bytestring.h +54 -32
  408. data/third_party/boringssl/include/openssl/cast.h +2 -2
  409. data/third_party/boringssl/include/openssl/cipher.h +46 -16
  410. data/third_party/boringssl/include/openssl/cmac.h +6 -2
  411. data/third_party/boringssl/include/openssl/conf.h +3 -6
  412. data/third_party/boringssl/include/openssl/cpu.h +25 -9
  413. data/third_party/boringssl/include/openssl/crypto.h +32 -10
  414. data/third_party/boringssl/include/openssl/curve25519.h +4 -4
  415. data/third_party/boringssl/include/openssl/dh.h +3 -2
  416. data/third_party/boringssl/include/openssl/digest.h +21 -7
  417. data/third_party/boringssl/include/openssl/dsa.h +8 -2
  418. data/third_party/boringssl/include/openssl/e_os2.h +18 -0
  419. data/third_party/boringssl/include/openssl/ec.h +25 -21
  420. data/third_party/boringssl/include/openssl/ec_key.h +36 -8
  421. data/third_party/boringssl/include/openssl/ecdh.h +17 -0
  422. data/third_party/boringssl/include/openssl/ecdsa.h +3 -3
  423. data/third_party/boringssl/include/openssl/engine.h +4 -4
  424. data/third_party/boringssl/include/openssl/err.h +3 -0
  425. data/third_party/boringssl/include/openssl/evp.h +199 -42
  426. data/third_party/boringssl/include/openssl/hmac.h +4 -4
  427. data/third_party/boringssl/include/openssl/hrss.h +100 -0
  428. data/third_party/boringssl/include/openssl/lhash.h +131 -23
  429. data/third_party/boringssl/include/openssl/md4.h +6 -4
  430. data/third_party/boringssl/include/openssl/md5.h +6 -4
  431. data/third_party/boringssl/include/openssl/mem.h +6 -2
  432. data/third_party/boringssl/include/openssl/nid.h +3 -0
  433. data/third_party/boringssl/include/openssl/obj.h +3 -0
  434. data/third_party/boringssl/include/openssl/pem.h +102 -64
  435. data/third_party/boringssl/include/openssl/pkcs7.h +136 -3
  436. data/third_party/boringssl/include/openssl/pkcs8.h +42 -3
  437. data/third_party/boringssl/include/openssl/pool.h +13 -2
  438. data/third_party/boringssl/include/openssl/ripemd.h +5 -4
  439. data/third_party/boringssl/include/openssl/rsa.h +46 -15
  440. data/third_party/boringssl/include/openssl/sha.h +40 -28
  441. data/third_party/boringssl/include/openssl/siphash.h +37 -0
  442. data/third_party/boringssl/include/openssl/span.h +17 -9
  443. data/third_party/boringssl/include/openssl/ssl.h +766 -393
  444. data/third_party/boringssl/include/openssl/ssl3.h +4 -3
  445. data/third_party/boringssl/include/openssl/stack.h +134 -77
  446. data/third_party/boringssl/include/openssl/thread.h +1 -1
  447. data/third_party/boringssl/include/openssl/tls1.h +25 -9
  448. data/third_party/boringssl/include/openssl/type_check.h +14 -15
  449. data/third_party/boringssl/include/openssl/x509.h +28 -3
  450. data/third_party/boringssl/include/openssl/x509_vfy.h +98 -32
  451. data/third_party/boringssl/include/openssl/x509v3.h +17 -13
  452. data/third_party/boringssl/ssl/d1_both.cc +9 -18
  453. data/third_party/boringssl/ssl/d1_lib.cc +4 -3
  454. data/third_party/boringssl/ssl/d1_pkt.cc +4 -4
  455. data/third_party/boringssl/ssl/d1_srtp.cc +15 -15
  456. data/third_party/boringssl/ssl/dtls_method.cc +0 -1
  457. data/third_party/boringssl/ssl/dtls_record.cc +28 -28
  458. data/third_party/boringssl/ssl/handoff.cc +295 -91
  459. data/third_party/boringssl/ssl/handshake.cc +133 -72
  460. data/third_party/boringssl/ssl/handshake_client.cc +218 -189
  461. data/third_party/boringssl/ssl/handshake_server.cc +399 -272
  462. data/third_party/boringssl/ssl/internal.h +1413 -928
  463. data/third_party/boringssl/ssl/s3_both.cc +175 -36
  464. data/third_party/boringssl/ssl/s3_lib.cc +9 -13
  465. data/third_party/boringssl/ssl/s3_pkt.cc +63 -29
  466. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +55 -35
  467. data/third_party/boringssl/ssl/ssl_asn1.cc +57 -73
  468. data/third_party/boringssl/ssl/ssl_buffer.cc +13 -12
  469. data/third_party/boringssl/ssl/ssl_cert.cc +313 -210
  470. data/third_party/boringssl/ssl/ssl_cipher.cc +159 -221
  471. data/third_party/boringssl/ssl/ssl_file.cc +2 -0
  472. data/third_party/boringssl/ssl/ssl_key_share.cc +164 -19
  473. data/third_party/boringssl/ssl/ssl_lib.cc +847 -555
  474. data/third_party/boringssl/ssl/ssl_privkey.cc +441 -111
  475. data/third_party/boringssl/ssl/ssl_session.cc +230 -178
  476. data/third_party/boringssl/ssl/ssl_transcript.cc +21 -142
  477. data/third_party/boringssl/ssl/ssl_versions.cc +88 -93
  478. data/third_party/boringssl/ssl/ssl_x509.cc +279 -218
  479. data/third_party/boringssl/ssl/t1_enc.cc +5 -96
  480. data/third_party/boringssl/ssl/t1_lib.cc +931 -678
  481. data/third_party/boringssl/ssl/tls13_both.cc +251 -121
  482. data/third_party/boringssl/ssl/tls13_client.cc +129 -73
  483. data/third_party/boringssl/ssl/tls13_enc.cc +350 -282
  484. data/third_party/boringssl/ssl/tls13_server.cc +259 -192
  485. data/third_party/boringssl/ssl/tls_method.cc +26 -21
  486. data/third_party/boringssl/ssl/tls_record.cc +42 -47
  487. data/third_party/boringssl/third_party/fiat/curve25519.c +261 -1324
  488. data/third_party/boringssl/third_party/fiat/curve25519_32.h +911 -0
  489. data/third_party/boringssl/third_party/fiat/curve25519_64.h +559 -0
  490. data/third_party/boringssl/third_party/fiat/p256.c +238 -999
  491. data/third_party/boringssl/third_party/fiat/p256_32.h +3226 -0
  492. data/third_party/boringssl/third_party/fiat/p256_64.h +1217 -0
  493. data/third_party/upb/upb/port_def.inc +1 -1
  494. data/third_party/upb/upb/table.c +2 -1
  495. metadata +71 -43
  496. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +0 -127
  497. data/src/core/lib/gpr/mpscq.cc +0 -117
  498. data/src/core/lib/gpr/mpscq.h +0 -88
  499. data/src/core/lib/gprpp/abstract.h +0 -47
  500. data/src/core/lib/gprpp/pair.h +0 -38
  501. data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +0 -460
  502. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +0 -256
  503. data/third_party/boringssl/include/openssl/lhash_macros.h +0 -174
  504. data/third_party/boringssl/ssl/custom_extensions.cc +0 -265
@@ -155,7 +155,7 @@
155
155
  #include "../crypto/internal.h"
156
156
 
157
157
 
158
- namespace bssl {
158
+ BSSL_NAMESPACE_BEGIN
159
159
 
160
160
  // check_ssl_x509_method asserts that |ssl| has the X509-based method
161
161
  // installed. Calling an X509-based method on an |ssl| with a different method
@@ -186,15 +186,11 @@ static UniquePtr<CRYPTO_BUFFER> x509_to_buffer(X509 *x509) {
186
186
  }
187
187
 
188
188
  // new_leafless_chain returns a fresh stack of buffers set to {NULL}.
189
- static STACK_OF(CRYPTO_BUFFER) *new_leafless_chain(void) {
190
- STACK_OF(CRYPTO_BUFFER) *chain = sk_CRYPTO_BUFFER_new_null();
191
- if (chain == NULL) {
192
- return NULL;
193
- }
194
-
195
- if (!sk_CRYPTO_BUFFER_push(chain, NULL)) {
196
- sk_CRYPTO_BUFFER_free(chain);
197
- return NULL;
189
+ static UniquePtr<STACK_OF(CRYPTO_BUFFER)> new_leafless_chain(void) {
190
+ UniquePtr<STACK_OF(CRYPTO_BUFFER)> chain(sk_CRYPTO_BUFFER_new_null());
191
+ if (!chain ||
192
+ !sk_CRYPTO_BUFFER_push(chain.get(), nullptr)) {
193
+ return nullptr;
198
194
  }
199
195
 
200
196
  return chain;
@@ -204,70 +200,64 @@ static STACK_OF(CRYPTO_BUFFER) *new_leafless_chain(void) {
204
200
  // forms of elements of |chain|. It returns one on success or zero on error, in
205
201
  // which case no change to |cert->chain| is made. It preverses the existing
206
202
  // leaf from |cert->chain|, if any.
207
- static int ssl_cert_set_chain(CERT *cert, STACK_OF(X509) *chain) {
203
+ static bool ssl_cert_set_chain(CERT *cert, STACK_OF(X509) *chain) {
208
204
  UniquePtr<STACK_OF(CRYPTO_BUFFER)> new_chain;
209
205
 
210
- if (cert->chain != NULL) {
206
+ if (cert->chain != nullptr) {
211
207
  new_chain.reset(sk_CRYPTO_BUFFER_new_null());
212
208
  if (!new_chain) {
213
- return 0;
209
+ return false;
214
210
  }
215
211
 
216
- CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain, 0);
217
- if (!sk_CRYPTO_BUFFER_push(new_chain.get(), leaf)) {
218
- return 0;
219
- }
220
212
  // |leaf| might be NULL if it's a “leafless” chain.
221
- if (leaf != NULL) {
222
- CRYPTO_BUFFER_up_ref(leaf);
213
+ CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain.get(), 0);
214
+ if (!PushToStack(new_chain.get(), UpRef(leaf))) {
215
+ return false;
223
216
  }
224
217
  }
225
218
 
226
219
  for (X509 *x509 : chain) {
227
220
  if (!new_chain) {
228
- new_chain.reset(new_leafless_chain());
221
+ new_chain = new_leafless_chain();
229
222
  if (!new_chain) {
230
- return 0;
223
+ return false;
231
224
  }
232
225
  }
233
226
 
234
227
  UniquePtr<CRYPTO_BUFFER> buffer = x509_to_buffer(x509);
235
228
  if (!buffer ||
236
229
  !PushToStack(new_chain.get(), std::move(buffer))) {
237
- return 0;
230
+ return false;
238
231
  }
239
232
  }
240
233
 
241
- sk_CRYPTO_BUFFER_pop_free(cert->chain, CRYPTO_BUFFER_free);
242
- cert->chain = new_chain.release();
243
-
244
- return 1;
234
+ cert->chain = std::move(new_chain);
235
+ return true;
245
236
  }
246
237
 
247
238
  static void ssl_crypto_x509_cert_flush_cached_leaf(CERT *cert) {
248
239
  X509_free(cert->x509_leaf);
249
- cert->x509_leaf = NULL;
240
+ cert->x509_leaf = nullptr;
250
241
  }
251
242
 
252
243
  static void ssl_crypto_x509_cert_flush_cached_chain(CERT *cert) {
253
244
  sk_X509_pop_free(cert->x509_chain, X509_free);
254
- cert->x509_chain = NULL;
245
+ cert->x509_chain = nullptr;
255
246
  }
256
247
 
257
- static int ssl_crypto_x509_check_client_CA_list(
248
+ static bool ssl_crypto_x509_check_client_CA_list(
258
249
  STACK_OF(CRYPTO_BUFFER) *names) {
259
250
  for (const CRYPTO_BUFFER *buffer : names) {
260
251
  const uint8_t *inp = CRYPTO_BUFFER_data(buffer);
261
- X509_NAME *name = d2i_X509_NAME(NULL, &inp, CRYPTO_BUFFER_len(buffer));
262
- const int ok = name != NULL && inp == CRYPTO_BUFFER_data(buffer) +
263
- CRYPTO_BUFFER_len(buffer);
264
- X509_NAME_free(name);
265
- if (!ok) {
266
- return 0;
252
+ UniquePtr<X509_NAME> name(
253
+ d2i_X509_NAME(nullptr, &inp, CRYPTO_BUFFER_len(buffer)));
254
+ if (name == nullptr ||
255
+ inp != CRYPTO_BUFFER_data(buffer) + CRYPTO_BUFFER_len(buffer)) {
256
+ return false;
267
257
  }
268
258
  }
269
259
 
270
- return 1;
260
+ return true;
271
261
  }
272
262
 
273
263
  static void ssl_crypto_x509_cert_clear(CERT *cert) {
@@ -275,7 +265,7 @@ static void ssl_crypto_x509_cert_clear(CERT *cert) {
275
265
  ssl_crypto_x509_cert_flush_cached_chain(cert);
276
266
 
277
267
  X509_free(cert->x509_stash);
278
- cert->x509_stash = NULL;
268
+ cert->x509_stash = nullptr;
279
269
  }
280
270
 
281
271
  static void ssl_crypto_x509_cert_free(CERT *cert) {
@@ -284,118 +274,131 @@ static void ssl_crypto_x509_cert_free(CERT *cert) {
284
274
  }
285
275
 
286
276
  static void ssl_crypto_x509_cert_dup(CERT *new_cert, const CERT *cert) {
287
- if (cert->verify_store != NULL) {
277
+ if (cert->verify_store != nullptr) {
288
278
  X509_STORE_up_ref(cert->verify_store);
289
279
  new_cert->verify_store = cert->verify_store;
290
280
  }
291
281
  }
292
282
 
293
- static int ssl_crypto_x509_session_cache_objects(SSL_SESSION *sess) {
294
- bssl::UniquePtr<STACK_OF(X509)> chain;
295
- if (sk_CRYPTO_BUFFER_num(sess->certs) > 0) {
283
+ static bool ssl_crypto_x509_session_cache_objects(SSL_SESSION *sess) {
284
+ bssl::UniquePtr<STACK_OF(X509)> chain, chain_without_leaf;
285
+ if (sk_CRYPTO_BUFFER_num(sess->certs.get()) > 0) {
296
286
  chain.reset(sk_X509_new_null());
297
287
  if (!chain) {
298
288
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
299
- return 0;
289
+ return false;
290
+ }
291
+ if (sess->is_server) {
292
+ // chain_without_leaf is only needed for server sessions. See
293
+ // |SSL_get_peer_cert_chain|.
294
+ chain_without_leaf.reset(sk_X509_new_null());
295
+ if (!chain_without_leaf) {
296
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
297
+ return false;
298
+ }
300
299
  }
301
300
  }
302
301
 
303
- X509 *leaf = nullptr;
304
- for (CRYPTO_BUFFER *cert : sess->certs) {
302
+ bssl::UniquePtr<X509> leaf;
303
+ for (CRYPTO_BUFFER *cert : sess->certs.get()) {
305
304
  UniquePtr<X509> x509(X509_parse_from_buffer(cert));
306
305
  if (!x509) {
307
306
  OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
308
- return 0;
307
+ return false;
309
308
  }
310
309
  if (leaf == nullptr) {
311
- leaf = x509.get();
310
+ leaf = UpRef(x509);
311
+ } else if (chain_without_leaf &&
312
+ !PushToStack(chain_without_leaf.get(), UpRef(x509))) {
313
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
314
+ return false;
312
315
  }
313
316
  if (!PushToStack(chain.get(), std::move(x509))) {
314
317
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
315
- return 0;
318
+ return false;
316
319
  }
317
320
  }
318
321
 
319
322
  sk_X509_pop_free(sess->x509_chain, X509_free);
320
323
  sess->x509_chain = chain.release();
324
+
321
325
  sk_X509_pop_free(sess->x509_chain_without_leaf, X509_free);
322
- sess->x509_chain_without_leaf = NULL;
326
+ sess->x509_chain_without_leaf = chain_without_leaf.release();
323
327
 
324
328
  X509_free(sess->x509_peer);
325
- if (leaf != NULL) {
326
- X509_up_ref(leaf);
327
- }
328
- sess->x509_peer = leaf;
329
- return 1;
329
+ sess->x509_peer = leaf.release();
330
+ return true;
330
331
  }
331
332
 
332
- static int ssl_crypto_x509_session_dup(SSL_SESSION *new_session,
333
- const SSL_SESSION *session) {
334
- if (session->x509_peer != NULL) {
335
- X509_up_ref(session->x509_peer);
336
- new_session->x509_peer = session->x509_peer;
337
- }
338
- if (session->x509_chain != NULL) {
333
+ static bool ssl_crypto_x509_session_dup(SSL_SESSION *new_session,
334
+ const SSL_SESSION *session) {
335
+ new_session->x509_peer = UpRef(session->x509_peer).release();
336
+ if (session->x509_chain != nullptr) {
339
337
  new_session->x509_chain = X509_chain_up_ref(session->x509_chain);
340
- if (new_session->x509_chain == NULL) {
341
- return 0;
338
+ if (new_session->x509_chain == nullptr) {
339
+ return false;
340
+ }
341
+ }
342
+ if (session->x509_chain_without_leaf != nullptr) {
343
+ new_session->x509_chain_without_leaf =
344
+ X509_chain_up_ref(session->x509_chain_without_leaf);
345
+ if (new_session->x509_chain_without_leaf == nullptr) {
346
+ return false;
342
347
  }
343
348
  }
344
349
 
345
- return 1;
350
+ return true;
346
351
  }
347
352
 
348
353
  static void ssl_crypto_x509_session_clear(SSL_SESSION *session) {
349
354
  X509_free(session->x509_peer);
350
- session->x509_peer = NULL;
355
+ session->x509_peer = nullptr;
351
356
  sk_X509_pop_free(session->x509_chain, X509_free);
352
- session->x509_chain = NULL;
357
+ session->x509_chain = nullptr;
353
358
  sk_X509_pop_free(session->x509_chain_without_leaf, X509_free);
354
- session->x509_chain_without_leaf = NULL;
359
+ session->x509_chain_without_leaf = nullptr;
355
360
  }
356
361
 
357
- static int ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,
358
- SSL *ssl,
359
- uint8_t *out_alert) {
362
+ static bool ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,
363
+ SSL_HANDSHAKE *hs,
364
+ uint8_t *out_alert) {
360
365
  *out_alert = SSL_AD_INTERNAL_ERROR;
361
366
  STACK_OF(X509) *const cert_chain = session->x509_chain;
362
- if (cert_chain == NULL || sk_X509_num(cert_chain) == 0) {
363
- return 0;
367
+ if (cert_chain == nullptr || sk_X509_num(cert_chain) == 0) {
368
+ return false;
364
369
  }
365
370
 
366
- X509_STORE *verify_store = ssl->ctx->cert_store;
367
- if (ssl->cert->verify_store != NULL) {
368
- verify_store = ssl->cert->verify_store;
371
+ SSL_CTX *ssl_ctx = hs->ssl->ctx.get();
372
+ X509_STORE *verify_store = ssl_ctx->cert_store;
373
+ if (hs->config->cert->verify_store != nullptr) {
374
+ verify_store = hs->config->cert->verify_store;
369
375
  }
370
376
 
371
377
  X509 *leaf = sk_X509_value(cert_chain, 0);
372
378
  ScopedX509_STORE_CTX ctx;
373
- if (!X509_STORE_CTX_init(ctx.get(), verify_store, leaf, cert_chain)) {
379
+ if (!X509_STORE_CTX_init(ctx.get(), verify_store, leaf, cert_chain) ||
380
+ !X509_STORE_CTX_set_ex_data(
381
+ ctx.get(), SSL_get_ex_data_X509_STORE_CTX_idx(), hs->ssl) ||
382
+ // We need to inherit the verify parameters. These can be determined by
383
+ // the context: if its a server it will verify SSL client certificates or
384
+ // vice versa.
385
+ !X509_STORE_CTX_set_default(
386
+ ctx.get(), hs->ssl->server ? "ssl_client" : "ssl_server") ||
387
+ // Anything non-default in "param" should overwrite anything in the ctx.
388
+ !X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(ctx.get()),
389
+ hs->config->param)) {
374
390
  OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
375
- return 0;
391
+ return false;
376
392
  }
377
- if (!X509_STORE_CTX_set_ex_data(ctx.get(),
378
- SSL_get_ex_data_X509_STORE_CTX_idx(), ssl)) {
379
- return 0;
380
- }
381
-
382
- // We need to inherit the verify parameters. These can be determined by the
383
- // context: if its a server it will verify SSL client certificates or vice
384
- // versa.
385
- X509_STORE_CTX_set_default(ctx.get(),
386
- ssl->server ? "ssl_client" : "ssl_server");
387
393
 
388
- // Anything non-default in "param" should overwrite anything in the ctx.
389
- X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(ctx.get()), ssl->param);
390
-
391
- if (ssl->verify_callback) {
392
- X509_STORE_CTX_set_verify_cb(ctx.get(), ssl->verify_callback);
394
+ if (hs->config->verify_callback) {
395
+ X509_STORE_CTX_set_verify_cb(ctx.get(), hs->config->verify_callback);
393
396
  }
394
397
 
395
398
  int verify_ret;
396
- if (ssl->ctx->app_verify_callback != NULL) {
399
+ if (ssl_ctx->app_verify_callback != nullptr) {
397
400
  verify_ret =
398
- ssl->ctx->app_verify_callback(ctx.get(), ssl->ctx->app_verify_arg);
401
+ ssl_ctx->app_verify_callback(ctx.get(), ssl_ctx->app_verify_arg);
399
402
  } else {
400
403
  verify_ret = X509_verify_cert(ctx.get());
401
404
  }
@@ -403,60 +406,61 @@ static int ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,
403
406
  session->verify_result = ctx->error;
404
407
 
405
408
  // If |SSL_VERIFY_NONE|, the error is non-fatal, but we keep the result.
406
- if (verify_ret <= 0 && ssl->verify_mode != SSL_VERIFY_NONE) {
409
+ if (verify_ret <= 0 && hs->config->verify_mode != SSL_VERIFY_NONE) {
407
410
  *out_alert = SSL_alert_from_verify_result(ctx->error);
408
- return 0;
411
+ return false;
409
412
  }
410
413
 
411
414
  ERR_clear_error();
412
- return 1;
415
+ return true;
413
416
  }
414
417
 
415
418
  static void ssl_crypto_x509_hs_flush_cached_ca_names(SSL_HANDSHAKE *hs) {
416
419
  sk_X509_NAME_pop_free(hs->cached_x509_ca_names, X509_NAME_free);
417
- hs->cached_x509_ca_names = NULL;
420
+ hs->cached_x509_ca_names = nullptr;
418
421
  }
419
422
 
420
- static int ssl_crypto_x509_ssl_new(SSL *ssl) {
421
- ssl->param = X509_VERIFY_PARAM_new();
422
- if (ssl->param == NULL) {
423
- return 0;
423
+ static bool ssl_crypto_x509_ssl_new(SSL_HANDSHAKE *hs) {
424
+ hs->config->param = X509_VERIFY_PARAM_new();
425
+ if (hs->config->param == nullptr) {
426
+ return false;
424
427
  }
425
- X509_VERIFY_PARAM_inherit(ssl->param, ssl->ctx->param);
426
- return 1;
428
+ X509_VERIFY_PARAM_inherit(hs->config->param, hs->ssl->ctx->param);
429
+ return true;
427
430
  }
428
431
 
429
- static void ssl_crypto_x509_ssl_flush_cached_client_CA(SSL *ssl) {
430
- sk_X509_NAME_pop_free(ssl->cached_x509_client_CA, X509_NAME_free);
431
- ssl->cached_x509_client_CA = NULL;
432
+ static void ssl_crypto_x509_ssl_flush_cached_client_CA(SSL_CONFIG *cfg) {
433
+ sk_X509_NAME_pop_free(cfg->cached_x509_client_CA, X509_NAME_free);
434
+ cfg->cached_x509_client_CA = nullptr;
432
435
  }
433
436
 
434
- static void ssl_crypto_x509_ssl_free(SSL *ssl) {
435
- ssl_crypto_x509_ssl_flush_cached_client_CA(ssl);
436
- X509_VERIFY_PARAM_free(ssl->param);
437
+ static void ssl_crypto_x509_ssl_config_free(SSL_CONFIG *cfg) {
438
+ sk_X509_NAME_pop_free(cfg->cached_x509_client_CA, X509_NAME_free);
439
+ cfg->cached_x509_client_CA = nullptr;
440
+ X509_VERIFY_PARAM_free(cfg->param);
437
441
  }
438
442
 
439
- static int ssl_crypto_x509_ssl_auto_chain_if_needed(SSL *ssl) {
443
+ static bool ssl_crypto_x509_ssl_auto_chain_if_needed(SSL_HANDSHAKE *hs) {
440
444
  // Only build a chain if there are no intermediates configured and the feature
441
445
  // isn't disabled.
442
- if ((ssl->mode & SSL_MODE_NO_AUTO_CHAIN) ||
443
- !ssl_has_certificate(ssl) ||
444
- ssl->cert->chain == NULL ||
445
- sk_CRYPTO_BUFFER_num(ssl->cert->chain) > 1) {
446
- return 1;
446
+ if ((hs->ssl->mode & SSL_MODE_NO_AUTO_CHAIN) ||
447
+ !ssl_has_certificate(hs) || hs->config->cert->chain == NULL ||
448
+ sk_CRYPTO_BUFFER_num(hs->config->cert->chain.get()) > 1) {
449
+ return true;
447
450
  }
448
451
 
449
- UniquePtr<X509> leaf(
450
- X509_parse_from_buffer(sk_CRYPTO_BUFFER_value(ssl->cert->chain, 0)));
452
+ UniquePtr<X509> leaf(X509_parse_from_buffer(
453
+ sk_CRYPTO_BUFFER_value(hs->config->cert->chain.get(), 0)));
451
454
  if (!leaf) {
452
455
  OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
453
- return 0;
456
+ return false;
454
457
  }
455
458
 
456
459
  ScopedX509_STORE_CTX ctx;
457
- if (!X509_STORE_CTX_init(ctx.get(), ssl->ctx->cert_store, leaf.get(), NULL)) {
460
+ if (!X509_STORE_CTX_init(ctx.get(), hs->ssl->ctx->cert_store, leaf.get(),
461
+ NULL)) {
458
462
  OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
459
- return 0;
463
+ return false;
460
464
  }
461
465
 
462
466
  // Attempt to build a chain, ignoring the result.
@@ -466,24 +470,24 @@ static int ssl_crypto_x509_ssl_auto_chain_if_needed(SSL *ssl) {
466
470
  // Remove the leaf from the generated chain.
467
471
  X509_free(sk_X509_shift(ctx->chain));
468
472
 
469
- if (!ssl_cert_set_chain(ssl->cert, ctx->chain)) {
470
- return 0;
473
+ if (!ssl_cert_set_chain(hs->config->cert.get(), ctx->chain)) {
474
+ return false;
471
475
  }
472
476
 
473
- ssl_crypto_x509_cert_flush_cached_chain(ssl->cert);
477
+ ssl_crypto_x509_cert_flush_cached_chain(hs->config->cert.get());
474
478
 
475
- return 1;
479
+ return true;
476
480
  }
477
481
 
478
482
  static void ssl_crypto_x509_ssl_ctx_flush_cached_client_CA(SSL_CTX *ctx) {
479
483
  sk_X509_NAME_pop_free(ctx->cached_x509_client_CA, X509_NAME_free);
480
- ctx->cached_x509_client_CA = NULL;
484
+ ctx->cached_x509_client_CA = nullptr;
481
485
  }
482
486
 
483
- static int ssl_crypto_x509_ssl_ctx_new(SSL_CTX *ctx) {
487
+ static bool ssl_crypto_x509_ssl_ctx_new(SSL_CTX *ctx) {
484
488
  ctx->cert_store = X509_STORE_new();
485
489
  ctx->param = X509_VERIFY_PARAM_new();
486
- return (ctx->cert_store != NULL && ctx->param != NULL);
490
+ return (ctx->cert_store != nullptr && ctx->param != nullptr);
487
491
  }
488
492
 
489
493
  static void ssl_crypto_x509_ssl_ctx_free(SSL_CTX *ctx) {
@@ -505,7 +509,7 @@ const SSL_X509_METHOD ssl_crypto_x509_method = {
505
509
  ssl_crypto_x509_session_verify_cert_chain,
506
510
  ssl_crypto_x509_hs_flush_cached_ca_names,
507
511
  ssl_crypto_x509_ssl_new,
508
- ssl_crypto_x509_ssl_free,
512
+ ssl_crypto_x509_ssl_config_free,
509
513
  ssl_crypto_x509_ssl_flush_cached_client_CA,
510
514
  ssl_crypto_x509_ssl_auto_chain_if_needed,
511
515
  ssl_crypto_x509_ssl_ctx_new,
@@ -513,7 +517,7 @@ const SSL_X509_METHOD ssl_crypto_x509_method = {
513
517
  ssl_crypto_x509_ssl_ctx_flush_cached_client_CA,
514
518
  };
515
519
 
516
- } // namespace bssl
520
+ BSSL_NAMESPACE_END
517
521
 
518
522
  using namespace bssl;
519
523
 
@@ -532,39 +536,17 @@ X509 *SSL_get_peer_certificate(const SSL *ssl) {
532
536
 
533
537
  STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *ssl) {
534
538
  check_ssl_x509_method(ssl);
535
- if (ssl == NULL) {
536
- return NULL;
539
+ if (ssl == nullptr) {
540
+ return nullptr;
537
541
  }
538
542
  SSL_SESSION *session = SSL_get_session(ssl);
539
- if (session == NULL ||
540
- session->x509_chain == NULL) {
541
- return NULL;
542
- }
543
-
544
- if (!ssl->server) {
545
- return session->x509_chain;
543
+ if (session == nullptr) {
544
+ return nullptr;
546
545
  }
547
546
 
548
547
  // OpenSSL historically didn't include the leaf certificate in the returned
549
548
  // certificate chain, but only for servers.
550
- if (session->x509_chain_without_leaf == NULL) {
551
- session->x509_chain_without_leaf = sk_X509_new_null();
552
- if (session->x509_chain_without_leaf == NULL) {
553
- return NULL;
554
- }
555
-
556
- for (size_t i = 1; i < sk_X509_num(session->x509_chain); i++) {
557
- X509 *cert = sk_X509_value(session->x509_chain, i);
558
- if (!sk_X509_push(session->x509_chain_without_leaf, cert)) {
559
- sk_X509_pop_free(session->x509_chain_without_leaf, X509_free);
560
- session->x509_chain_without_leaf = NULL;
561
- return NULL;
562
- }
563
- X509_up_ref(cert);
564
- }
565
- }
566
-
567
- return session->x509_chain_without_leaf;
549
+ return ssl->server ? session->x509_chain_without_leaf : session->x509_chain;
568
550
  }
569
551
 
570
552
  STACK_OF(X509) *SSL_get_peer_full_cert_chain(const SSL *ssl) {
@@ -584,7 +566,10 @@ int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose) {
584
566
 
585
567
  int SSL_set_purpose(SSL *ssl, int purpose) {
586
568
  check_ssl_x509_method(ssl);
587
- return X509_VERIFY_PARAM_set_purpose(ssl->param, purpose);
569
+ if (!ssl->config) {
570
+ return 0;
571
+ }
572
+ return X509_VERIFY_PARAM_set_purpose(ssl->config->param, purpose);
588
573
  }
589
574
 
590
575
  int SSL_CTX_set_trust(SSL_CTX *ctx, int trust) {
@@ -594,7 +579,10 @@ int SSL_CTX_set_trust(SSL_CTX *ctx, int trust) {
594
579
 
595
580
  int SSL_set_trust(SSL *ssl, int trust) {
596
581
  check_ssl_x509_method(ssl);
597
- return X509_VERIFY_PARAM_set_trust(ssl->param, trust);
582
+ if (!ssl->config) {
583
+ return 0;
584
+ }
585
+ return X509_VERIFY_PARAM_set_trust(ssl->config->param, trust);
598
586
  }
599
587
 
600
588
  int SSL_CTX_set1_param(SSL_CTX *ctx, const X509_VERIFY_PARAM *param) {
@@ -604,7 +592,10 @@ int SSL_CTX_set1_param(SSL_CTX *ctx, const X509_VERIFY_PARAM *param) {
604
592
 
605
593
  int SSL_set1_param(SSL *ssl, const X509_VERIFY_PARAM *param) {
606
594
  check_ssl_x509_method(ssl);
607
- return X509_VERIFY_PARAM_set1(ssl->param, param);
595
+ if (!ssl->config) {
596
+ return 0;
597
+ }
598
+ return X509_VERIFY_PARAM_set1(ssl->config->param, param);
608
599
  }
609
600
 
610
601
  X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx) {
@@ -614,17 +605,29 @@ X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx) {
614
605
 
615
606
  X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl) {
616
607
  check_ssl_x509_method(ssl);
617
- return ssl->param;
608
+ if (!ssl->config) {
609
+ assert(ssl->config);
610
+ return 0;
611
+ }
612
+ return ssl->config->param;
618
613
  }
619
614
 
620
615
  int SSL_get_verify_depth(const SSL *ssl) {
621
616
  check_ssl_x509_method(ssl);
622
- return X509_VERIFY_PARAM_get_depth(ssl->param);
617
+ if (!ssl->config) {
618
+ assert(ssl->config);
619
+ return 0;
620
+ }
621
+ return X509_VERIFY_PARAM_get_depth(ssl->config->param);
623
622
  }
624
623
 
625
624
  int (*SSL_get_verify_callback(const SSL *ssl))(int, X509_STORE_CTX *) {
626
625
  check_ssl_x509_method(ssl);
627
- return ssl->verify_callback;
626
+ if (!ssl->config) {
627
+ assert(ssl->config);
628
+ return 0;
629
+ }
630
+ return ssl->config->verify_callback;
628
631
  }
629
632
 
630
633
  int SSL_CTX_get_verify_mode(const SSL_CTX *ctx) {
@@ -646,15 +649,21 @@ int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(
646
649
  void SSL_set_verify(SSL *ssl, int mode,
647
650
  int (*callback)(int ok, X509_STORE_CTX *store_ctx)) {
648
651
  check_ssl_x509_method(ssl);
649
- ssl->verify_mode = mode;
652
+ if (!ssl->config) {
653
+ return;
654
+ }
655
+ ssl->config->verify_mode = mode;
650
656
  if (callback != NULL) {
651
- ssl->verify_callback = callback;
657
+ ssl->config->verify_callback = callback;
652
658
  }
653
659
  }
654
660
 
655
661
  void SSL_set_verify_depth(SSL *ssl, int depth) {
656
662
  check_ssl_x509_method(ssl);
657
- X509_VERIFY_PARAM_set_depth(ssl->param, depth);
663
+ if (!ssl->config) {
664
+ return;
665
+ }
666
+ X509_VERIFY_PARAM_set_depth(ssl->config->param, depth);
658
667
  }
659
668
 
660
669
  void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,
@@ -732,12 +741,15 @@ static int ssl_use_certificate(CERT *cert, X509 *x) {
732
741
 
733
742
  int SSL_use_certificate(SSL *ssl, X509 *x) {
734
743
  check_ssl_x509_method(ssl);
735
- return ssl_use_certificate(ssl->cert, x);
744
+ if (!ssl->config) {
745
+ return 0;
746
+ }
747
+ return ssl_use_certificate(ssl->config->cert.get(), x);
736
748
  }
737
749
 
738
750
  int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x) {
739
751
  check_ssl_ctx_x509_method(ctx);
740
- return ssl_use_certificate(ctx->cert, x);
752
+ return ssl_use_certificate(ctx->cert.get(), x);
741
753
  }
742
754
 
743
755
  // ssl_cert_cache_leaf_cert sets |cert->x509_leaf|, if currently NULL, from the
@@ -750,7 +762,7 @@ static int ssl_cert_cache_leaf_cert(CERT *cert) {
750
762
  return 1;
751
763
  }
752
764
 
753
- CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain, 0);
765
+ CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain.get(), 0);
754
766
  if (!leaf) {
755
767
  return 1;
756
768
  }
@@ -770,13 +782,17 @@ static X509 *ssl_cert_get0_leaf(CERT *cert) {
770
782
 
771
783
  X509 *SSL_get_certificate(const SSL *ssl) {
772
784
  check_ssl_x509_method(ssl);
773
- return ssl_cert_get0_leaf(ssl->cert);
785
+ if (!ssl->config) {
786
+ assert(ssl->config);
787
+ return 0;
788
+ }
789
+ return ssl_cert_get0_leaf(ssl->config->cert.get());
774
790
  }
775
791
 
776
792
  X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx) {
777
793
  check_ssl_ctx_x509_method(ctx);
778
794
  MutexWriteLock lock(const_cast<CRYPTO_MUTEX*>(&ctx->lock));
779
- return ssl_cert_get0_leaf(ctx->cert);
795
+ return ssl_cert_get0_leaf(ctx->cert.get());
780
796
  }
781
797
 
782
798
  static int ssl_cert_set0_chain(CERT *cert, STACK_OF(X509) *chain) {
@@ -807,14 +823,13 @@ static int ssl_cert_append_cert(CERT *cert, X509 *x509) {
807
823
  }
808
824
 
809
825
  if (cert->chain != NULL) {
810
- return PushToStack(cert->chain, std::move(buffer));
826
+ return PushToStack(cert->chain.get(), std::move(buffer));
811
827
  }
812
828
 
813
829
  cert->chain = new_leafless_chain();
814
- if (cert->chain == NULL ||
815
- !PushToStack(cert->chain, std::move(buffer))) {
816
- sk_CRYPTO_BUFFER_free(cert->chain);
817
- cert->chain = NULL;
830
+ if (!cert->chain ||
831
+ !PushToStack(cert->chain.get(), std::move(buffer))) {
832
+ cert->chain.reset();
818
833
  return 0;
819
834
  }
820
835
 
@@ -843,32 +858,38 @@ static int ssl_cert_add1_chain_cert(CERT *cert, X509 *x509) {
843
858
 
844
859
  int SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
845
860
  check_ssl_ctx_x509_method(ctx);
846
- return ssl_cert_set0_chain(ctx->cert, chain);
861
+ return ssl_cert_set0_chain(ctx->cert.get(), chain);
847
862
  }
848
863
 
849
864
  int SSL_CTX_set1_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
850
865
  check_ssl_ctx_x509_method(ctx);
851
- return ssl_cert_set1_chain(ctx->cert, chain);
866
+ return ssl_cert_set1_chain(ctx->cert.get(), chain);
852
867
  }
853
868
 
854
869
  int SSL_set0_chain(SSL *ssl, STACK_OF(X509) *chain) {
855
870
  check_ssl_x509_method(ssl);
856
- return ssl_cert_set0_chain(ssl->cert, chain);
871
+ if (!ssl->config) {
872
+ return 0;
873
+ }
874
+ return ssl_cert_set0_chain(ssl->config->cert.get(), chain);
857
875
  }
858
876
 
859
877
  int SSL_set1_chain(SSL *ssl, STACK_OF(X509) *chain) {
860
878
  check_ssl_x509_method(ssl);
861
- return ssl_cert_set1_chain(ssl->cert, chain);
879
+ if (!ssl->config) {
880
+ return 0;
881
+ }
882
+ return ssl_cert_set1_chain(ssl->config->cert.get(), chain);
862
883
  }
863
884
 
864
885
  int SSL_CTX_add0_chain_cert(SSL_CTX *ctx, X509 *x509) {
865
886
  check_ssl_ctx_x509_method(ctx);
866
- return ssl_cert_add0_chain_cert(ctx->cert, x509);
887
+ return ssl_cert_add0_chain_cert(ctx->cert.get(), x509);
867
888
  }
868
889
 
869
890
  int SSL_CTX_add1_chain_cert(SSL_CTX *ctx, X509 *x509) {
870
891
  check_ssl_ctx_x509_method(ctx);
871
- return ssl_cert_add1_chain_cert(ctx->cert, x509);
892
+ return ssl_cert_add1_chain_cert(ctx->cert.get(), x509);
872
893
  }
873
894
 
874
895
  int SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *x509) {
@@ -878,12 +899,18 @@ int SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *x509) {
878
899
 
879
900
  int SSL_add0_chain_cert(SSL *ssl, X509 *x509) {
880
901
  check_ssl_x509_method(ssl);
881
- return ssl_cert_add0_chain_cert(ssl->cert, x509);
902
+ if (!ssl->config) {
903
+ return 0;
904
+ }
905
+ return ssl_cert_add0_chain_cert(ssl->config->cert.get(), x509);
882
906
  }
883
907
 
884
908
  int SSL_add1_chain_cert(SSL *ssl, X509 *x509) {
885
909
  check_ssl_x509_method(ssl);
886
- return ssl_cert_add1_chain_cert(ssl->cert, x509);
910
+ if (!ssl->config) {
911
+ return 0;
912
+ }
913
+ return ssl_cert_add1_chain_cert(ssl->config->cert.get(), x509);
887
914
  }
888
915
 
889
916
  int SSL_CTX_clear_chain_certs(SSL_CTX *ctx) {
@@ -906,9 +933,9 @@ int SSL_clear_chain_certs(SSL *ssl) {
906
933
  static int ssl_cert_cache_chain_certs(CERT *cert) {
907
934
  assert(cert->x509_method);
908
935
 
909
- if (cert->x509_chain != NULL ||
910
- cert->chain == NULL ||
911
- sk_CRYPTO_BUFFER_num(cert->chain) < 2) {
936
+ if (cert->x509_chain != nullptr ||
937
+ cert->chain == nullptr ||
938
+ sk_CRYPTO_BUFFER_num(cert->chain.get()) < 2) {
912
939
  return 1;
913
940
  }
914
941
 
@@ -917,8 +944,8 @@ static int ssl_cert_cache_chain_certs(CERT *cert) {
917
944
  return 0;
918
945
  }
919
946
 
920
- for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(cert->chain); i++) {
921
- CRYPTO_BUFFER *buffer = sk_CRYPTO_BUFFER_value(cert->chain, i);
947
+ for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(cert->chain.get()); i++) {
948
+ CRYPTO_BUFFER *buffer = sk_CRYPTO_BUFFER_value(cert->chain.get(), i);
922
949
  UniquePtr<X509> x509(X509_parse_from_buffer(buffer));
923
950
  if (!x509 ||
924
951
  !PushToStack(chain.get(), std::move(x509))) {
@@ -933,7 +960,7 @@ static int ssl_cert_cache_chain_certs(CERT *cert) {
933
960
  int SSL_CTX_get0_chain_certs(const SSL_CTX *ctx, STACK_OF(X509) **out_chain) {
934
961
  check_ssl_ctx_x509_method(ctx);
935
962
  MutexWriteLock lock(const_cast<CRYPTO_MUTEX*>(&ctx->lock));
936
- if (!ssl_cert_cache_chain_certs(ctx->cert)) {
963
+ if (!ssl_cert_cache_chain_certs(ctx->cert.get())) {
937
964
  *out_chain = NULL;
938
965
  return 0;
939
966
  }
@@ -949,26 +976,38 @@ int SSL_CTX_get_extra_chain_certs(const SSL_CTX *ctx,
949
976
 
950
977
  int SSL_get0_chain_certs(const SSL *ssl, STACK_OF(X509) **out_chain) {
951
978
  check_ssl_x509_method(ssl);
952
- if (!ssl_cert_cache_chain_certs(ssl->cert)) {
979
+ if (!ssl->config) {
980
+ assert(ssl->config);
981
+ return 0;
982
+ }
983
+ if (!ssl_cert_cache_chain_certs(ssl->config->cert.get())) {
953
984
  *out_chain = NULL;
954
985
  return 0;
955
986
  }
956
987
 
957
- *out_chain = ssl->cert->x509_chain;
988
+ *out_chain = ssl->config->cert->x509_chain;
958
989
  return 1;
959
990
  }
960
991
 
961
- static SSL_SESSION *ssl_session_new_with_crypto_x509(void) {
962
- return ssl_session_new(&ssl_crypto_x509_method).release();
963
- }
964
-
965
992
  SSL_SESSION *d2i_SSL_SESSION_bio(BIO *bio, SSL_SESSION **out) {
966
- return ASN1_d2i_bio_of(SSL_SESSION, ssl_session_new_with_crypto_x509,
967
- d2i_SSL_SESSION, bio, out);
993
+ uint8_t *data;
994
+ size_t len;
995
+ if (!BIO_read_asn1(bio, &data, &len, 1024 * 1024)) {
996
+ return 0;
997
+ }
998
+ bssl::UniquePtr<uint8_t> free_data(data);
999
+ const uint8_t *ptr = data;
1000
+ return d2i_SSL_SESSION(out, &ptr, static_cast<long>(len));
968
1001
  }
969
1002
 
970
1003
  int i2d_SSL_SESSION_bio(BIO *bio, const SSL_SESSION *session) {
971
- return ASN1_i2d_bio_of(SSL_SESSION, i2d_SSL_SESSION, bio, session);
1004
+ uint8_t *data;
1005
+ size_t len;
1006
+ if (!SSL_SESSION_to_bytes(session, &data, &len)) {
1007
+ return 0;
1008
+ }
1009
+ bssl::UniquePtr<uint8_t> free_data(data);
1010
+ return BIO_write_all(bio, data, len);
972
1011
  }
973
1012
 
974
1013
  IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION)
@@ -1000,7 +1039,7 @@ STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *list) {
1000
1039
  return sk_X509_NAME_deep_copy(list, X509_NAME_dup, X509_NAME_free);
1001
1040
  }
1002
1041
 
1003
- static void set_client_CA_list(STACK_OF(CRYPTO_BUFFER) **ca_list,
1042
+ static void set_client_CA_list(UniquePtr<STACK_OF(CRYPTO_BUFFER)> *ca_list,
1004
1043
  const STACK_OF(X509_NAME) *name_list,
1005
1044
  CRYPTO_BUFFER_POOL *pool) {
1006
1045
  UniquePtr<STACK_OF(CRYPTO_BUFFER)> buffers(sk_CRYPTO_BUFFER_new_null());
@@ -1023,14 +1062,16 @@ static void set_client_CA_list(STACK_OF(CRYPTO_BUFFER) **ca_list,
1023
1062
  }
1024
1063
  }
1025
1064
 
1026
- sk_CRYPTO_BUFFER_pop_free(*ca_list, CRYPTO_BUFFER_free);
1027
- *ca_list = buffers.release();
1065
+ *ca_list = std::move(buffers);
1028
1066
  }
1029
1067
 
1030
1068
  void SSL_set_client_CA_list(SSL *ssl, STACK_OF(X509_NAME) *name_list) {
1031
1069
  check_ssl_x509_method(ssl);
1032
- ssl->ctx->x509_method->ssl_flush_cached_client_CA(ssl);
1033
- set_client_CA_list(&ssl->client_CA, name_list, ssl->ctx->pool);
1070
+ if (!ssl->config) {
1071
+ return;
1072
+ }
1073
+ ssl->ctx->x509_method->ssl_flush_cached_client_CA(ssl->config.get());
1074
+ set_client_CA_list(&ssl->config->client_CA, name_list, ssl->ctx->pool);
1034
1075
  sk_X509_NAME_pop_free(name_list, X509_NAME_free);
1035
1076
  }
1036
1077
 
@@ -1075,6 +1116,10 @@ static STACK_OF(X509_NAME) *
1075
1116
 
1076
1117
  STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *ssl) {
1077
1118
  check_ssl_x509_method(ssl);
1119
+ if (!ssl->config) {
1120
+ assert(ssl->config);
1121
+ return NULL;
1122
+ }
1078
1123
  // For historical reasons, this function is used both to query configuration
1079
1124
  // state on a server as well as handshake state on a client. However, whether
1080
1125
  // |ssl| is a client or server is not known until explicitly configured with
@@ -1089,11 +1134,12 @@ STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *ssl) {
1089
1134
  return NULL;
1090
1135
  }
1091
1136
 
1092
- if (ssl->client_CA != NULL) {
1137
+ if (ssl->config->client_CA != NULL) {
1093
1138
  return buffer_names_to_x509(
1094
- ssl->client_CA, (STACK_OF(X509_NAME) **)&ssl->cached_x509_client_CA);
1139
+ ssl->config->client_CA.get(),
1140
+ (STACK_OF(X509_NAME) **)&ssl->config->cached_x509_client_CA);
1095
1141
  }
1096
- return SSL_CTX_get_client_CA_list(ssl->ctx);
1142
+ return SSL_CTX_get_client_CA_list(ssl->ctx.get());
1097
1143
  }
1098
1144
 
1099
1145
  STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx) {
@@ -1102,11 +1148,11 @@ STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx) {
1102
1148
  // so it needs to lock around updating |cached_x509_client_CA|.
1103
1149
  MutexWriteLock lock(const_cast<CRYPTO_MUTEX *>(&ctx->lock));
1104
1150
  return buffer_names_to_x509(
1105
- ctx->client_CA,
1151
+ ctx->client_CA.get(),
1106
1152
  const_cast<STACK_OF(X509_NAME) **>(&ctx->cached_x509_client_CA));
1107
1153
  }
1108
1154
 
1109
- static int add_client_CA(STACK_OF(CRYPTO_BUFFER) **names, X509 *x509,
1155
+ static int add_client_CA(UniquePtr<STACK_OF(CRYPTO_BUFFER)> *names, X509 *x509,
1110
1156
  CRYPTO_BUFFER_POOL *pool) {
1111
1157
  if (x509 == NULL) {
1112
1158
  return 0;
@@ -1125,8 +1171,8 @@ static int add_client_CA(STACK_OF(CRYPTO_BUFFER) **names, X509 *x509,
1125
1171
  }
1126
1172
 
1127
1173
  int alloced = 0;
1128
- if (*names == NULL) {
1129
- *names = sk_CRYPTO_BUFFER_new_null();
1174
+ if (*names == nullptr) {
1175
+ names->reset(sk_CRYPTO_BUFFER_new_null());
1130
1176
  alloced = 1;
1131
1177
 
1132
1178
  if (*names == NULL) {
@@ -1134,10 +1180,9 @@ static int add_client_CA(STACK_OF(CRYPTO_BUFFER) **names, X509 *x509,
1134
1180
  }
1135
1181
  }
1136
1182
 
1137
- if (!PushToStack(*names, std::move(buffer))) {
1183
+ if (!PushToStack(names->get(), std::move(buffer))) {
1138
1184
  if (alloced) {
1139
- sk_CRYPTO_BUFFER_pop_free(*names, CRYPTO_BUFFER_free);
1140
- *names = NULL;
1185
+ names->reset();
1141
1186
  }
1142
1187
  return 0;
1143
1188
  }
@@ -1147,11 +1192,14 @@ static int add_client_CA(STACK_OF(CRYPTO_BUFFER) **names, X509 *x509,
1147
1192
 
1148
1193
  int SSL_add_client_CA(SSL *ssl, X509 *x509) {
1149
1194
  check_ssl_x509_method(ssl);
1150
- if (!add_client_CA(&ssl->client_CA, x509, ssl->ctx->pool)) {
1195
+ if (!ssl->config) {
1196
+ return 0;
1197
+ }
1198
+ if (!add_client_CA(&ssl->config->client_CA, x509, ssl->ctx->pool)) {
1151
1199
  return 0;
1152
1200
  }
1153
1201
 
1154
- ssl_crypto_x509_ssl_flush_cached_client_CA(ssl);
1202
+ ssl_crypto_x509_ssl_flush_cached_client_CA(ssl->config.get());
1155
1203
  return 1;
1156
1204
  }
1157
1205
 
@@ -1166,7 +1214,14 @@ int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x509) {
1166
1214
  }
1167
1215
 
1168
1216
  static int do_client_cert_cb(SSL *ssl, void *arg) {
1169
- if (ssl_has_certificate(ssl) || ssl->ctx->client_cert_cb == NULL) {
1217
+ // Should only be called during handshake, but check to be sure.
1218
+ if (!ssl->config) {
1219
+ assert(ssl->config);
1220
+ return -1;
1221
+ }
1222
+
1223
+ if (ssl_has_certificate(ssl->s3->hs.get()) ||
1224
+ ssl->ctx->client_cert_cb == NULL) {
1170
1225
  return 1;
1171
1226
  }
1172
1227
 
@@ -1230,12 +1285,18 @@ int SSL_CTX_set1_verify_cert_store(SSL_CTX *ctx, X509_STORE *store) {
1230
1285
 
1231
1286
  int SSL_set0_verify_cert_store(SSL *ssl, X509_STORE *store) {
1232
1287
  check_ssl_x509_method(ssl);
1233
- return set_cert_store(&ssl->cert->verify_store, store, 0);
1288
+ if (!ssl->config) {
1289
+ return 0;
1290
+ }
1291
+ return set_cert_store(&ssl->config->cert->verify_store, store, 0);
1234
1292
  }
1235
1293
 
1236
1294
  int SSL_set1_verify_cert_store(SSL *ssl, X509_STORE *store) {
1237
1295
  check_ssl_x509_method(ssl);
1238
- return set_cert_store(&ssl->cert->verify_store, store, 1);
1296
+ if (!ssl->config) {
1297
+ return 0;
1298
+ }
1299
+ return set_cert_store(&ssl->config->cert->verify_store, store, 1);
1239
1300
  }
1240
1301
 
1241
1302
  int SSL_alert_from_verify_result(long result) {