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
@@ -69,31 +69,28 @@
69
69
  #include "../crypto/internal.h"
70
70
 
71
71
 
72
- namespace bssl {
72
+ BSSL_NAMESPACE_BEGIN
73
73
 
74
- int ssl_is_key_type_supported(int key_type) {
74
+ bool ssl_is_key_type_supported(int key_type) {
75
75
  return key_type == EVP_PKEY_RSA || key_type == EVP_PKEY_EC ||
76
76
  key_type == EVP_PKEY_ED25519;
77
77
  }
78
78
 
79
- static int ssl_set_pkey(CERT *cert, EVP_PKEY *pkey) {
79
+ static bool ssl_set_pkey(CERT *cert, EVP_PKEY *pkey) {
80
80
  if (!ssl_is_key_type_supported(pkey->type)) {
81
81
  OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CERTIFICATE_TYPE);
82
- return 0;
82
+ return false;
83
83
  }
84
84
 
85
- if (cert->chain != NULL &&
86
- sk_CRYPTO_BUFFER_value(cert->chain, 0) != NULL &&
85
+ if (cert->chain != nullptr &&
86
+ sk_CRYPTO_BUFFER_value(cert->chain.get(), 0) != nullptr &&
87
87
  // Sanity-check that the private key and the certificate match.
88
88
  !ssl_cert_check_private_key(cert, pkey)) {
89
- return 0;
89
+ return false;
90
90
  }
91
91
 
92
- EVP_PKEY_free(cert->privatekey);
93
- EVP_PKEY_up_ref(pkey);
94
- cert->privatekey = pkey;
95
-
96
- return 1;
92
+ cert->privatekey = UpRef(pkey);
93
+ return true;
97
94
  }
98
95
 
99
96
  typedef struct {
@@ -101,29 +98,30 @@ typedef struct {
101
98
  int pkey_type;
102
99
  int curve;
103
100
  const EVP_MD *(*digest_func)(void);
104
- char is_rsa_pss;
101
+ bool is_rsa_pss;
105
102
  } SSL_SIGNATURE_ALGORITHM;
106
103
 
107
104
  static const SSL_SIGNATURE_ALGORITHM kSignatureAlgorithms[] = {
108
- {SSL_SIGN_RSA_PKCS1_MD5_SHA1, EVP_PKEY_RSA, NID_undef, &EVP_md5_sha1, 0},
109
- {SSL_SIGN_RSA_PKCS1_SHA1, EVP_PKEY_RSA, NID_undef, &EVP_sha1, 0},
110
- {SSL_SIGN_RSA_PKCS1_SHA256, EVP_PKEY_RSA, NID_undef, &EVP_sha256, 0},
111
- {SSL_SIGN_RSA_PKCS1_SHA384, EVP_PKEY_RSA, NID_undef, &EVP_sha384, 0},
112
- {SSL_SIGN_RSA_PKCS1_SHA512, EVP_PKEY_RSA, NID_undef, &EVP_sha512, 0},
113
-
114
- {SSL_SIGN_RSA_PSS_SHA256, EVP_PKEY_RSA, NID_undef, &EVP_sha256, 1},
115
- {SSL_SIGN_RSA_PSS_SHA384, EVP_PKEY_RSA, NID_undef, &EVP_sha384, 1},
116
- {SSL_SIGN_RSA_PSS_SHA512, EVP_PKEY_RSA, NID_undef, &EVP_sha512, 1},
117
-
118
- {SSL_SIGN_ECDSA_SHA1, EVP_PKEY_EC, NID_undef, &EVP_sha1, 0},
105
+ {SSL_SIGN_RSA_PKCS1_MD5_SHA1, EVP_PKEY_RSA, NID_undef, &EVP_md5_sha1,
106
+ false},
107
+ {SSL_SIGN_RSA_PKCS1_SHA1, EVP_PKEY_RSA, NID_undef, &EVP_sha1, false},
108
+ {SSL_SIGN_RSA_PKCS1_SHA256, EVP_PKEY_RSA, NID_undef, &EVP_sha256, false},
109
+ {SSL_SIGN_RSA_PKCS1_SHA384, EVP_PKEY_RSA, NID_undef, &EVP_sha384, false},
110
+ {SSL_SIGN_RSA_PKCS1_SHA512, EVP_PKEY_RSA, NID_undef, &EVP_sha512, false},
111
+
112
+ {SSL_SIGN_RSA_PSS_RSAE_SHA256, EVP_PKEY_RSA, NID_undef, &EVP_sha256, true},
113
+ {SSL_SIGN_RSA_PSS_RSAE_SHA384, EVP_PKEY_RSA, NID_undef, &EVP_sha384, true},
114
+ {SSL_SIGN_RSA_PSS_RSAE_SHA512, EVP_PKEY_RSA, NID_undef, &EVP_sha512, true},
115
+
116
+ {SSL_SIGN_ECDSA_SHA1, EVP_PKEY_EC, NID_undef, &EVP_sha1, false},
119
117
  {SSL_SIGN_ECDSA_SECP256R1_SHA256, EVP_PKEY_EC, NID_X9_62_prime256v1,
120
- &EVP_sha256, 0},
118
+ &EVP_sha256, false},
121
119
  {SSL_SIGN_ECDSA_SECP384R1_SHA384, EVP_PKEY_EC, NID_secp384r1, &EVP_sha384,
122
- 0},
120
+ false},
123
121
  {SSL_SIGN_ECDSA_SECP521R1_SHA512, EVP_PKEY_EC, NID_secp521r1, &EVP_sha512,
124
- 0},
122
+ false},
125
123
 
126
- {SSL_SIGN_ED25519, EVP_PKEY_ED25519, NID_undef, NULL, 0},
124
+ {SSL_SIGN_ED25519, EVP_PKEY_ED25519, NID_undef, nullptr, false},
127
125
  };
128
126
 
129
127
  static const SSL_SIGNATURE_ALGORITHM *get_signature_algorithm(uint16_t sigalg) {
@@ -135,22 +133,28 @@ static const SSL_SIGNATURE_ALGORITHM *get_signature_algorithm(uint16_t sigalg) {
135
133
  return NULL;
136
134
  }
137
135
 
138
- int ssl_has_private_key(const SSL *ssl) {
139
- return ssl->cert->privatekey != NULL || ssl->cert->key_method != NULL;
136
+ bool ssl_has_private_key(const SSL_HANDSHAKE *hs) {
137
+ if (hs->config->cert->privatekey != nullptr ||
138
+ hs->config->cert->key_method != nullptr ||
139
+ ssl_signing_with_dc(hs)) {
140
+ return true;
141
+ }
142
+
143
+ return false;
140
144
  }
141
145
 
142
- static int pkey_supports_algorithm(const SSL *ssl, EVP_PKEY *pkey,
143
- uint16_t sigalg) {
146
+ static bool pkey_supports_algorithm(const SSL *ssl, EVP_PKEY *pkey,
147
+ uint16_t sigalg) {
144
148
  const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
145
149
  if (alg == NULL ||
146
150
  EVP_PKEY_id(pkey) != alg->pkey_type) {
147
- return 0;
151
+ return false;
148
152
  }
149
153
 
150
154
  if (ssl_protocol_version(ssl) >= TLS1_3_VERSION) {
151
155
  // RSA keys may only be used with RSA-PSS.
152
156
  if (alg->pkey_type == EVP_PKEY_RSA && !alg->is_rsa_pss) {
153
- return 0;
157
+ return false;
154
158
  }
155
159
 
156
160
  // EC keys have a curve requirement.
@@ -158,18 +162,18 @@ static int pkey_supports_algorithm(const SSL *ssl, EVP_PKEY *pkey,
158
162
  (alg->curve == NID_undef ||
159
163
  EC_GROUP_get_curve_name(
160
164
  EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(pkey))) != alg->curve)) {
161
- return 0;
165
+ return false;
162
166
  }
163
167
  }
164
168
 
165
- return 1;
169
+ return true;
166
170
  }
167
171
 
168
- static int setup_ctx(SSL *ssl, EVP_MD_CTX *ctx, EVP_PKEY *pkey, uint16_t sigalg,
169
- int is_verify) {
172
+ static bool setup_ctx(SSL *ssl, EVP_MD_CTX *ctx, EVP_PKEY *pkey,
173
+ uint16_t sigalg, bool is_verify) {
170
174
  if (!pkey_supports_algorithm(ssl, pkey, sigalg)) {
171
175
  OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
172
- return 0;
176
+ return false;
173
177
  }
174
178
 
175
179
  const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
@@ -177,33 +181,40 @@ static int setup_ctx(SSL *ssl, EVP_MD_CTX *ctx, EVP_PKEY *pkey, uint16_t sigalg,
177
181
  EVP_PKEY_CTX *pctx;
178
182
  if (is_verify) {
179
183
  if (!EVP_DigestVerifyInit(ctx, &pctx, digest, NULL, pkey)) {
180
- return 0;
184
+ return false;
181
185
  }
182
186
  } else if (!EVP_DigestSignInit(ctx, &pctx, digest, NULL, pkey)) {
183
- return 0;
187
+ return false;
184
188
  }
185
189
 
186
190
  if (alg->is_rsa_pss) {
187
191
  if (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) ||
188
192
  !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1 /* salt len = hash len */)) {
189
- return 0;
193
+ return false;
190
194
  }
191
195
  }
192
196
 
193
- return 1;
197
+ return true;
194
198
  }
195
199
 
196
200
  enum ssl_private_key_result_t ssl_private_key_sign(
197
201
  SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len, size_t max_out,
198
202
  uint16_t sigalg, Span<const uint8_t> in) {
199
203
  SSL *const ssl = hs->ssl;
200
- if (ssl->cert->key_method != NULL) {
204
+ const SSL_PRIVATE_KEY_METHOD *key_method = hs->config->cert->key_method;
205
+ EVP_PKEY *privatekey = hs->config->cert->privatekey.get();
206
+ if (ssl_signing_with_dc(hs)) {
207
+ key_method = hs->config->cert->dc_key_method;
208
+ privatekey = hs->config->cert->dc_privatekey.get();
209
+ }
210
+
211
+ if (key_method != NULL) {
201
212
  enum ssl_private_key_result_t ret;
202
213
  if (hs->pending_private_key_op) {
203
- ret = ssl->cert->key_method->complete(ssl, out, out_len, max_out);
214
+ ret = key_method->complete(ssl, out, out_len, max_out);
204
215
  } else {
205
- ret = ssl->cert->key_method->sign(ssl, out, out_len, max_out, sigalg,
206
- in.data(), in.size());
216
+ ret = key_method->sign(ssl, out, out_len, max_out,
217
+ sigalg, in.data(), in.size());
207
218
  }
208
219
  if (ret == ssl_private_key_failure) {
209
220
  OPENSSL_PUT_ERROR(SSL, SSL_R_PRIVATE_KEY_OPERATION_FAILED);
@@ -214,7 +225,7 @@ enum ssl_private_key_result_t ssl_private_key_sign(
214
225
 
215
226
  *out_len = max_out;
216
227
  ScopedEVP_MD_CTX ctx;
217
- if (!setup_ctx(ssl, ctx.get(), ssl->cert->privatekey, sigalg, 0 /* sign */) ||
228
+ if (!setup_ctx(ssl, ctx.get(), privatekey, sigalg, false /* sign */) ||
218
229
  !EVP_DigestSign(ctx.get(), out, out_len, in.data(), in.size())) {
219
230
  return ssl_private_key_failure;
220
231
  }
@@ -225,9 +236,16 @@ bool ssl_public_key_verify(SSL *ssl, Span<const uint8_t> signature,
225
236
  uint16_t sigalg, EVP_PKEY *pkey,
226
237
  Span<const uint8_t> in) {
227
238
  ScopedEVP_MD_CTX ctx;
228
- return setup_ctx(ssl, ctx.get(), pkey, sigalg, 1 /* verify */) &&
229
- EVP_DigestVerify(ctx.get(), signature.data(), signature.size(),
230
- in.data(), in.size());
239
+ if (!setup_ctx(ssl, ctx.get(), pkey, sigalg, true /* verify */)) {
240
+ return false;
241
+ }
242
+ bool ok = EVP_DigestVerify(ctx.get(), signature.data(), signature.size(),
243
+ in.data(), in.size());
244
+ #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
245
+ ok = true;
246
+ ERR_clear_error();
247
+ #endif
248
+ return ok;
231
249
  }
232
250
 
233
251
  enum ssl_private_key_result_t ssl_private_key_decrypt(SSL_HANDSHAKE *hs,
@@ -236,13 +254,13 @@ enum ssl_private_key_result_t ssl_private_key_decrypt(SSL_HANDSHAKE *hs,
236
254
  size_t max_out,
237
255
  Span<const uint8_t> in) {
238
256
  SSL *const ssl = hs->ssl;
239
- if (ssl->cert->key_method != NULL) {
257
+ if (hs->config->cert->key_method != NULL) {
240
258
  enum ssl_private_key_result_t ret;
241
259
  if (hs->pending_private_key_op) {
242
- ret = ssl->cert->key_method->complete(ssl, out, out_len, max_out);
260
+ ret = hs->config->cert->key_method->complete(ssl, out, out_len, max_out);
243
261
  } else {
244
- ret = ssl->cert->key_method->decrypt(ssl, out, out_len, max_out,
245
- in.data(), in.size());
262
+ ret = hs->config->cert->key_method->decrypt(ssl, out, out_len, max_out,
263
+ in.data(), in.size());
246
264
  }
247
265
  if (ret == ssl_private_key_failure) {
248
266
  OPENSSL_PUT_ERROR(SSL, SSL_R_PRIVATE_KEY_OPERATION_FAILED);
@@ -251,7 +269,7 @@ enum ssl_private_key_result_t ssl_private_key_decrypt(SSL_HANDSHAKE *hs,
251
269
  return ret;
252
270
  }
253
271
 
254
- RSA *rsa = EVP_PKEY_get0_RSA(ssl->cert->privatekey);
272
+ RSA *rsa = EVP_PKEY_get0_RSA(hs->config->cert->privatekey.get());
255
273
  if (rsa == NULL) {
256
274
  // Decrypt operations are only supported for RSA keys.
257
275
  OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
@@ -289,12 +307,12 @@ bool ssl_private_key_supports_signature_algorithm(SSL_HANDSHAKE *hs,
289
307
  return true;
290
308
  }
291
309
 
292
- } // namespace bssl
310
+ BSSL_NAMESPACE_END
293
311
 
294
312
  using namespace bssl;
295
313
 
296
314
  int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa) {
297
- if (rsa == NULL) {
315
+ if (rsa == NULL || ssl->config == NULL) {
298
316
  OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER);
299
317
  return 0;
300
318
  }
@@ -306,7 +324,7 @@ int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa) {
306
324
  return 0;
307
325
  }
308
326
 
309
- return ssl_set_pkey(ssl->cert, pkey.get());
327
+ return ssl_set_pkey(ssl->config->cert.get(), pkey.get());
310
328
  }
311
329
 
312
330
  int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, const uint8_t *der, size_t der_len) {
@@ -320,12 +338,12 @@ int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, const uint8_t *der, size_t der_len) {
320
338
  }
321
339
 
322
340
  int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey) {
323
- if (pkey == NULL) {
341
+ if (pkey == NULL || ssl->config == NULL) {
324
342
  OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER);
325
343
  return 0;
326
344
  }
327
345
 
328
- return ssl_set_pkey(ssl->cert, pkey);
346
+ return ssl_set_pkey(ssl->config->cert.get(), pkey);
329
347
  }
330
348
 
331
349
  int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, const uint8_t *der,
@@ -358,7 +376,7 @@ int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa) {
358
376
  return 0;
359
377
  }
360
378
 
361
- return ssl_set_pkey(ctx->cert, pkey.get());
379
+ return ssl_set_pkey(ctx->cert.get(), pkey.get());
362
380
  }
363
381
 
364
382
  int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const uint8_t *der,
@@ -378,7 +396,7 @@ int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey) {
378
396
  return 0;
379
397
  }
380
398
 
381
- return ssl_set_pkey(ctx->cert, pkey);
399
+ return ssl_set_pkey(ctx->cert.get(), pkey);
382
400
  }
383
401
 
384
402
  int SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, const uint8_t *der,
@@ -400,7 +418,10 @@ int SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, const uint8_t *der,
400
418
 
401
419
  void SSL_set_private_key_method(SSL *ssl,
402
420
  const SSL_PRIVATE_KEY_METHOD *key_method) {
403
- ssl->cert->key_method = key_method;
421
+ if (!ssl->config) {
422
+ return;
423
+ }
424
+ ssl->config->cert->key_method = key_method;
404
425
  }
405
426
 
406
427
  void SSL_CTX_set_private_key_method(SSL_CTX *ctx,
@@ -408,38 +429,49 @@ void SSL_CTX_set_private_key_method(SSL_CTX *ctx,
408
429
  ctx->cert->key_method = key_method;
409
430
  }
410
431
 
432
+ static constexpr size_t kMaxSignatureAlgorithmNameLen = 23;
433
+
434
+ // This was "constexpr" rather than "const", but that triggered a bug in MSVC
435
+ // where it didn't pad the strings to the correct length.
436
+ static const struct {
437
+ uint16_t signature_algorithm;
438
+ const char name[kMaxSignatureAlgorithmNameLen];
439
+ } kSignatureAlgorithmNames[] = {
440
+ {SSL_SIGN_RSA_PKCS1_MD5_SHA1, "rsa_pkcs1_md5_sha1"},
441
+ {SSL_SIGN_RSA_PKCS1_SHA1, "rsa_pkcs1_sha1"},
442
+ {SSL_SIGN_RSA_PKCS1_SHA256, "rsa_pkcs1_sha256"},
443
+ {SSL_SIGN_RSA_PKCS1_SHA384, "rsa_pkcs1_sha384"},
444
+ {SSL_SIGN_RSA_PKCS1_SHA512, "rsa_pkcs1_sha512"},
445
+ {SSL_SIGN_ECDSA_SHA1, "ecdsa_sha1"},
446
+ {SSL_SIGN_ECDSA_SECP256R1_SHA256, "ecdsa_secp256r1_sha256"},
447
+ {SSL_SIGN_ECDSA_SECP384R1_SHA384, "ecdsa_secp384r1_sha384"},
448
+ {SSL_SIGN_ECDSA_SECP521R1_SHA512, "ecdsa_secp521r1_sha512"},
449
+ {SSL_SIGN_RSA_PSS_RSAE_SHA256, "rsa_pss_rsae_sha256"},
450
+ {SSL_SIGN_RSA_PSS_RSAE_SHA384, "rsa_pss_rsae_sha384"},
451
+ {SSL_SIGN_RSA_PSS_RSAE_SHA512, "rsa_pss_rsae_sha512"},
452
+ {SSL_SIGN_ED25519, "ed25519"},
453
+ };
454
+
411
455
  const char *SSL_get_signature_algorithm_name(uint16_t sigalg,
412
456
  int include_curve) {
413
- switch (sigalg) {
414
- case SSL_SIGN_RSA_PKCS1_MD5_SHA1:
415
- return "rsa_pkcs1_md5_sha1";
416
- case SSL_SIGN_RSA_PKCS1_SHA1:
417
- return "rsa_pkcs1_sha1";
418
- case SSL_SIGN_RSA_PKCS1_SHA256:
419
- return "rsa_pkcs1_sha256";
420
- case SSL_SIGN_RSA_PKCS1_SHA384:
421
- return "rsa_pkcs1_sha384";
422
- case SSL_SIGN_RSA_PKCS1_SHA512:
423
- return "rsa_pkcs1_sha512";
424
- case SSL_SIGN_ECDSA_SHA1:
425
- return "ecdsa_sha1";
426
- case SSL_SIGN_ECDSA_SECP256R1_SHA256:
427
- return include_curve ? "ecdsa_secp256r1_sha256" : "ecdsa_sha256";
428
- case SSL_SIGN_ECDSA_SECP384R1_SHA384:
429
- return include_curve ? "ecdsa_secp384r1_sha384" : "ecdsa_sha384";
430
- case SSL_SIGN_ECDSA_SECP521R1_SHA512:
431
- return include_curve ? "ecdsa_secp521r1_sha512" : "ecdsa_sha512";
432
- case SSL_SIGN_RSA_PSS_SHA256:
433
- return "rsa_pss_sha256";
434
- case SSL_SIGN_RSA_PSS_SHA384:
435
- return "rsa_pss_sha384";
436
- case SSL_SIGN_RSA_PSS_SHA512:
437
- return "rsa_pss_sha512";
438
- case SSL_SIGN_ED25519:
439
- return "ed25519";
440
- default:
441
- return NULL;
457
+ if (!include_curve) {
458
+ switch (sigalg) {
459
+ case SSL_SIGN_ECDSA_SECP256R1_SHA256:
460
+ return "ecdsa_sha256";
461
+ case SSL_SIGN_ECDSA_SECP384R1_SHA384:
462
+ return "ecdsa_sha384";
463
+ case SSL_SIGN_ECDSA_SECP521R1_SHA512:
464
+ return "ecdsa_sha512";
465
+ }
442
466
  }
467
+
468
+ for (const auto &candidate : kSignatureAlgorithmNames) {
469
+ if (candidate.signature_algorithm == sigalg) {
470
+ return candidate.name;
471
+ }
472
+ }
473
+
474
+ return NULL;
443
475
  }
444
476
 
445
477
  int SSL_get_signature_algorithm_key_type(uint16_t sigalg) {
@@ -460,35 +492,333 @@ int SSL_is_signature_algorithm_rsa_pss(uint16_t sigalg) {
460
492
  return alg != nullptr && alg->is_rsa_pss;
461
493
  }
462
494
 
463
- static int set_algorithm_prefs(uint16_t **out_prefs, size_t *out_num_prefs,
464
- const uint16_t *prefs, size_t num_prefs) {
465
- OPENSSL_free(*out_prefs);
495
+ int SSL_CTX_set_signing_algorithm_prefs(SSL_CTX *ctx, const uint16_t *prefs,
496
+ size_t num_prefs) {
497
+ return ctx->cert->sigalgs.CopyFrom(MakeConstSpan(prefs, num_prefs));
498
+ }
466
499
 
467
- *out_num_prefs = 0;
468
- *out_prefs = (uint16_t *)BUF_memdup(prefs, num_prefs * sizeof(prefs[0]));
469
- if (*out_prefs == NULL) {
470
- OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
500
+ int SSL_set_signing_algorithm_prefs(SSL *ssl, const uint16_t *prefs,
501
+ size_t num_prefs) {
502
+ if (!ssl->config) {
503
+ return 0;
504
+ }
505
+ return ssl->config->cert->sigalgs.CopyFrom(MakeConstSpan(prefs, num_prefs));
506
+ }
507
+
508
+ static constexpr struct {
509
+ int pkey_type;
510
+ int hash_nid;
511
+ uint16_t signature_algorithm;
512
+ } kSignatureAlgorithmsMapping[] = {
513
+ {EVP_PKEY_RSA, NID_sha1, SSL_SIGN_RSA_PKCS1_SHA1},
514
+ {EVP_PKEY_RSA, NID_sha256, SSL_SIGN_RSA_PKCS1_SHA256},
515
+ {EVP_PKEY_RSA, NID_sha384, SSL_SIGN_RSA_PKCS1_SHA384},
516
+ {EVP_PKEY_RSA, NID_sha512, SSL_SIGN_RSA_PKCS1_SHA512},
517
+ {EVP_PKEY_RSA_PSS, NID_sha256, SSL_SIGN_RSA_PSS_RSAE_SHA256},
518
+ {EVP_PKEY_RSA_PSS, NID_sha384, SSL_SIGN_RSA_PSS_RSAE_SHA384},
519
+ {EVP_PKEY_RSA_PSS, NID_sha512, SSL_SIGN_RSA_PSS_RSAE_SHA512},
520
+ {EVP_PKEY_EC, NID_sha1, SSL_SIGN_ECDSA_SHA1},
521
+ {EVP_PKEY_EC, NID_sha256, SSL_SIGN_ECDSA_SECP256R1_SHA256},
522
+ {EVP_PKEY_EC, NID_sha384, SSL_SIGN_ECDSA_SECP384R1_SHA384},
523
+ {EVP_PKEY_EC, NID_sha512, SSL_SIGN_ECDSA_SECP521R1_SHA512},
524
+ {EVP_PKEY_ED25519, NID_undef, SSL_SIGN_ED25519},
525
+ };
526
+
527
+ static bool parse_sigalg_pairs(Array<uint16_t> *out, const int *values,
528
+ size_t num_values) {
529
+ if ((num_values & 1) == 1) {
530
+ return false;
531
+ }
532
+
533
+ const size_t num_pairs = num_values / 2;
534
+ if (!out->Init(num_pairs)) {
535
+ return false;
536
+ }
537
+
538
+ for (size_t i = 0; i < num_values; i += 2) {
539
+ const int hash_nid = values[i];
540
+ const int pkey_type = values[i+1];
541
+
542
+ bool found = false;
543
+ for (const auto &candidate : kSignatureAlgorithmsMapping) {
544
+ if (candidate.pkey_type == pkey_type && candidate.hash_nid == hash_nid) {
545
+ (*out)[i / 2] = candidate.signature_algorithm;
546
+ found = true;
547
+ break;
548
+ }
549
+ }
550
+
551
+ if (!found) {
552
+ OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
553
+ ERR_add_error_dataf("unknown hash:%d pkey:%d", hash_nid, pkey_type);
554
+ return false;
555
+ }
556
+ }
557
+
558
+ return true;
559
+ }
560
+
561
+ static int compare_uint16_t(const void *p1, const void *p2) {
562
+ uint16_t u1 = *((const uint16_t *)p1);
563
+ uint16_t u2 = *((const uint16_t *)p2);
564
+ if (u1 < u2) {
565
+ return -1;
566
+ } else if (u1 > u2) {
567
+ return 1;
568
+ } else {
569
+ return 0;
570
+ }
571
+ }
572
+
573
+ static bool sigalgs_unique(Span<const uint16_t> in_sigalgs) {
574
+ if (in_sigalgs.size() < 2) {
575
+ return true;
576
+ }
577
+
578
+ Array<uint16_t> sigalgs;
579
+ if (!sigalgs.CopyFrom(in_sigalgs)) {
580
+ return false;
581
+ }
582
+
583
+ qsort(sigalgs.data(), sigalgs.size(), sizeof(uint16_t), compare_uint16_t);
584
+
585
+ for (size_t i = 1; i < sigalgs.size(); i++) {
586
+ if (sigalgs[i - 1] == sigalgs[i]) {
587
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DUPLICATE_SIGNATURE_ALGORITHM);
588
+ return false;
589
+ }
590
+ }
591
+
592
+ return true;
593
+ }
594
+
595
+ int SSL_CTX_set1_sigalgs(SSL_CTX *ctx, const int *values, size_t num_values) {
596
+ Array<uint16_t> sigalgs;
597
+ if (!parse_sigalg_pairs(&sigalgs, values, num_values) ||
598
+ !sigalgs_unique(sigalgs)) {
599
+ return 0;
600
+ }
601
+
602
+ if (!SSL_CTX_set_signing_algorithm_prefs(ctx, sigalgs.data(),
603
+ sigalgs.size()) ||
604
+ !ctx->verify_sigalgs.CopyFrom(sigalgs)) {
471
605
  return 0;
472
606
  }
473
- *out_num_prefs = num_prefs;
474
607
 
475
608
  return 1;
476
609
  }
477
610
 
478
- int SSL_CTX_set_signing_algorithm_prefs(SSL_CTX *ctx, const uint16_t *prefs,
479
- size_t num_prefs) {
480
- return set_algorithm_prefs(&ctx->cert->sigalgs, &ctx->cert->num_sigalgs,
481
- prefs, num_prefs);
611
+ int SSL_set1_sigalgs(SSL *ssl, const int *values, size_t num_values) {
612
+ if (!ssl->config) {
613
+ OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
614
+ return 0;
615
+ }
616
+
617
+ Array<uint16_t> sigalgs;
618
+ if (!parse_sigalg_pairs(&sigalgs, values, num_values) ||
619
+ !sigalgs_unique(sigalgs)) {
620
+ return 0;
621
+ }
622
+
623
+ if (!SSL_set_signing_algorithm_prefs(ssl, sigalgs.data(), sigalgs.size()) ||
624
+ !ssl->config->verify_sigalgs.CopyFrom(sigalgs)) {
625
+ return 0;
626
+ }
627
+
628
+ return 1;
482
629
  }
483
630
 
484
- int SSL_set_signing_algorithm_prefs(SSL *ssl, const uint16_t *prefs,
485
- size_t num_prefs) {
486
- return set_algorithm_prefs(&ssl->cert->sigalgs, &ssl->cert->num_sigalgs,
487
- prefs, num_prefs);
631
+ static bool parse_sigalgs_list(Array<uint16_t> *out, const char *str) {
632
+ // str looks like "RSA+SHA1:ECDSA+SHA256:ecdsa_secp256r1_sha256".
633
+
634
+ // Count colons to give the number of output elements from any successful
635
+ // parse.
636
+ size_t num_elements = 1;
637
+ size_t len = 0;
638
+ for (const char *p = str; *p; p++) {
639
+ len++;
640
+ if (*p == ':') {
641
+ num_elements++;
642
+ }
643
+ }
644
+
645
+ if (!out->Init(num_elements)) {
646
+ return false;
647
+ }
648
+ size_t out_i = 0;
649
+
650
+ enum {
651
+ pkey_or_name,
652
+ hash_name,
653
+ } state = pkey_or_name;
654
+
655
+ char buf[kMaxSignatureAlgorithmNameLen];
656
+ // buf_used is always < sizeof(buf). I.e. it's always safe to write
657
+ // buf[buf_used] = 0.
658
+ size_t buf_used = 0;
659
+
660
+ int pkey_type = 0, hash_nid = 0;
661
+
662
+ // Note that the loop runs to len+1, i.e. it'll process the terminating NUL.
663
+ for (size_t offset = 0; offset < len+1; offset++) {
664
+ const char c = str[offset];
665
+
666
+ switch (c) {
667
+ case '+':
668
+ if (state == hash_name) {
669
+ OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
670
+ ERR_add_error_dataf("+ found in hash name at offset %zu", offset);
671
+ return false;
672
+ }
673
+ if (buf_used == 0) {
674
+ OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
675
+ ERR_add_error_dataf("empty public key type at offset %zu", offset);
676
+ return false;
677
+ }
678
+ buf[buf_used] = 0;
679
+
680
+ if (strcmp(buf, "RSA") == 0) {
681
+ pkey_type = EVP_PKEY_RSA;
682
+ } else if (strcmp(buf, "RSA-PSS") == 0 ||
683
+ strcmp(buf, "PSS") == 0) {
684
+ pkey_type = EVP_PKEY_RSA_PSS;
685
+ } else if (strcmp(buf, "ECDSA") == 0) {
686
+ pkey_type = EVP_PKEY_EC;
687
+ } else {
688
+ OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
689
+ ERR_add_error_dataf("unknown public key type '%s'", buf);
690
+ return false;
691
+ }
692
+
693
+ state = hash_name;
694
+ buf_used = 0;
695
+ break;
696
+
697
+ case ':':
698
+ OPENSSL_FALLTHROUGH;
699
+ case 0:
700
+ if (buf_used == 0) {
701
+ OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
702
+ ERR_add_error_dataf("empty element at offset %zu", offset);
703
+ return false;
704
+ }
705
+
706
+ buf[buf_used] = 0;
707
+
708
+ if (state == pkey_or_name) {
709
+ // No '+' was seen thus this is a TLS 1.3-style name.
710
+ bool found = false;
711
+ for (const auto &candidate : kSignatureAlgorithmNames) {
712
+ if (strcmp(candidate.name, buf) == 0) {
713
+ assert(out_i < num_elements);
714
+ (*out)[out_i++] = candidate.signature_algorithm;
715
+ found = true;
716
+ break;
717
+ }
718
+ }
719
+
720
+ if (!found) {
721
+ OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
722
+ ERR_add_error_dataf("unknown signature algorithm '%s'", buf);
723
+ return false;
724
+ }
725
+ } else {
726
+ if (strcmp(buf, "SHA1") == 0) {
727
+ hash_nid = NID_sha1;
728
+ } else if (strcmp(buf, "SHA256") == 0) {
729
+ hash_nid = NID_sha256;
730
+ } else if (strcmp(buf, "SHA384") == 0) {
731
+ hash_nid = NID_sha384;
732
+ } else if (strcmp(buf, "SHA512") == 0) {
733
+ hash_nid = NID_sha512;
734
+ } else {
735
+ OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
736
+ ERR_add_error_dataf("unknown hash function '%s'", buf);
737
+ return false;
738
+ }
739
+
740
+ bool found = false;
741
+ for (const auto &candidate : kSignatureAlgorithmsMapping) {
742
+ if (candidate.pkey_type == pkey_type &&
743
+ candidate.hash_nid == hash_nid) {
744
+ assert(out_i < num_elements);
745
+ (*out)[out_i++] = candidate.signature_algorithm;
746
+ found = true;
747
+ break;
748
+ }
749
+ }
750
+
751
+ if (!found) {
752
+ OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
753
+ ERR_add_error_dataf("unknown pkey:%d hash:%s", pkey_type, buf);
754
+ return false;
755
+ }
756
+ }
757
+
758
+ state = pkey_or_name;
759
+ buf_used = 0;
760
+ break;
761
+
762
+ default:
763
+ if (buf_used == sizeof(buf) - 1) {
764
+ OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
765
+ ERR_add_error_dataf("substring too long at offset %zu", offset);
766
+ return false;
767
+ }
768
+
769
+ if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') ||
770
+ (c >= 'A' && c <= 'Z') || c == '-' || c == '_') {
771
+ buf[buf_used++] = c;
772
+ } else {
773
+ OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
774
+ ERR_add_error_dataf("invalid character 0x%02x at offest %zu", c,
775
+ offset);
776
+ return false;
777
+ }
778
+ }
779
+ }
780
+
781
+ assert(out_i == out->size());
782
+ return true;
783
+ }
784
+
785
+ int SSL_CTX_set1_sigalgs_list(SSL_CTX *ctx, const char *str) {
786
+ Array<uint16_t> sigalgs;
787
+ if (!parse_sigalgs_list(&sigalgs, str) ||
788
+ !sigalgs_unique(sigalgs)) {
789
+ return 0;
790
+ }
791
+
792
+ if (!SSL_CTX_set_signing_algorithm_prefs(ctx, sigalgs.data(),
793
+ sigalgs.size()) ||
794
+ !ctx->verify_sigalgs.CopyFrom(sigalgs)) {
795
+ return 0;
796
+ }
797
+
798
+ return 1;
799
+ }
800
+
801
+ int SSL_set1_sigalgs_list(SSL *ssl, const char *str) {
802
+ if (!ssl->config) {
803
+ OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
804
+ return 0;
805
+ }
806
+
807
+ Array<uint16_t> sigalgs;
808
+ if (!parse_sigalgs_list(&sigalgs, str) ||
809
+ !sigalgs_unique(sigalgs)) {
810
+ return 0;
811
+ }
812
+
813
+ if (!SSL_set_signing_algorithm_prefs(ssl, sigalgs.data(), sigalgs.size()) ||
814
+ !ssl->config->verify_sigalgs.CopyFrom(sigalgs)) {
815
+ return 0;
816
+ }
817
+
818
+ return 1;
488
819
  }
489
820
 
490
821
  int SSL_CTX_set_verify_algorithm_prefs(SSL_CTX *ctx, const uint16_t *prefs,
491
822
  size_t num_prefs) {
492
- return set_algorithm_prefs(&ctx->verify_sigalgs, &ctx->num_verify_sigalgs,
493
- prefs, num_prefs);
823
+ return ctx->verify_sigalgs.CopyFrom(MakeConstSpan(prefs, num_prefs));
494
824
  }