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
@@ -24,13 +24,14 @@
24
24
  #include <openssl/digest.h>
25
25
  #include <openssl/err.h>
26
26
  #include <openssl/mem.h>
27
+ #include <openssl/sha.h>
27
28
  #include <openssl/stack.h>
28
29
 
29
30
  #include "../crypto/internal.h"
30
31
  #include "internal.h"
31
32
 
32
33
 
33
- namespace bssl {
34
+ BSSL_NAMESPACE_BEGIN
34
35
 
35
36
  enum client_hs_state_t {
36
37
  state_read_hello_retry_request = 0,
@@ -40,6 +41,7 @@ enum client_hs_state_t {
40
41
  state_read_certificate_request,
41
42
  state_read_server_certificate,
42
43
  state_read_server_certificate_verify,
44
+ state_server_certificate_reverify,
43
45
  state_read_server_finished,
44
46
  state_send_end_of_early_data,
45
47
  state_send_client_certificate,
@@ -157,21 +159,23 @@ static enum ssl_hs_wait_t do_read_hello_retry_request(SSL_HANDSHAKE *hs) {
157
159
  }
158
160
 
159
161
  // The group must be supported.
160
- if (!tls1_check_group_id(ssl, group_id)) {
162
+ if (!tls1_check_group_id(hs, group_id)) {
161
163
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
162
164
  OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
163
165
  return ssl_hs_error;
164
166
  }
165
167
 
166
- // Check that the HelloRetryRequest does not request the key share that
167
- // was provided in the initial ClientHello.
168
- if (hs->key_share->GroupID() == group_id) {
168
+ // Check that the HelloRetryRequest does not request a key share that was
169
+ // provided in the initial ClientHello.
170
+ if (hs->key_shares[0]->GroupID() == group_id ||
171
+ (hs->key_shares[1] && hs->key_shares[1]->GroupID() == group_id)) {
169
172
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
170
173
  OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
171
174
  return ssl_hs_error;
172
175
  }
173
176
 
174
- hs->key_share.reset();
177
+ hs->key_shares[0].reset();
178
+ hs->key_shares[1].reset();
175
179
  hs->retry_group = group_id;
176
180
  }
177
181
 
@@ -184,6 +188,7 @@ static enum ssl_hs_wait_t do_read_hello_retry_request(SSL_HANDSHAKE *hs) {
184
188
  hs->tls13_state = state_send_second_client_hello;
185
189
  // 0-RTT is rejected if we receive a HelloRetryRequest.
186
190
  if (hs->in_early_data) {
191
+ ssl->s3->early_data_reason = ssl_early_data_hello_retry_request;
187
192
  return ssl_hs_early_data_rejected;
188
193
  }
189
194
  return ssl_hs_ok;
@@ -290,6 +295,16 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
290
295
  return ssl_hs_error;
291
296
  }
292
297
 
298
+ // Recheck supported_versions, in case this is the second ServerHello.
299
+ uint16_t version;
300
+ if (!have_supported_versions ||
301
+ !CBS_get_u16(&supported_versions, &version) ||
302
+ version != ssl->version) {
303
+ OPENSSL_PUT_ERROR(SSL, SSL_R_SECOND_SERVERHELLO_VERSION_MISMATCH);
304
+ ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
305
+ return ssl_hs_error;
306
+ }
307
+
293
308
  alert = SSL_AD_DECODE_ERROR;
294
309
  if (have_pre_shared_key) {
295
310
  if (ssl->session == NULL) {
@@ -316,7 +331,7 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
316
331
  return ssl_hs_error;
317
332
  }
318
333
 
319
- if (!ssl_session_is_context_valid(ssl, ssl->session)) {
334
+ if (!ssl_session_is_context_valid(hs, ssl->session.get())) {
320
335
  // This is actually a client application bug.
321
336
  OPENSSL_PUT_ERROR(SSL,
322
337
  SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
@@ -326,7 +341,8 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
326
341
 
327
342
  ssl->s3->session_reused = true;
328
343
  // Only authentication information carries over in TLS 1.3.
329
- hs->new_session = SSL_SESSION_dup(ssl->session, SSL_SESSION_DUP_AUTH_ONLY);
344
+ hs->new_session =
345
+ SSL_SESSION_dup(ssl->session.get(), SSL_SESSION_DUP_AUTH_ONLY);
330
346
  if (!hs->new_session) {
331
347
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
332
348
  return ssl_hs_error;
@@ -349,11 +365,12 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
349
365
 
350
366
  // Set up the key schedule and incorporate the PSK into the running secret.
351
367
  if (ssl->s3->session_reused) {
352
- if (!tls13_init_key_schedule(hs, hs->new_session->master_key,
353
- hs->new_session->master_key_length)) {
368
+ if (!tls13_init_key_schedule(
369
+ hs, MakeConstSpan(hs->new_session->master_key,
370
+ hs->new_session->master_key_length))) {
354
371
  return ssl_hs_error;
355
372
  }
356
- } else if (!tls13_init_key_schedule(hs, kZeroes, hash_len)) {
373
+ } else if (!tls13_init_key_schedule(hs, MakeConstSpan(kZeroes, hash_len))) {
357
374
  return ssl_hs_error;
358
375
  }
359
376
 
@@ -373,19 +390,19 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
373
390
  return ssl_hs_error;
374
391
  }
375
392
 
376
- if (!tls13_advance_key_schedule(hs, dhe_secret.data(), dhe_secret.size()) ||
393
+ if (!tls13_advance_key_schedule(hs, dhe_secret) ||
377
394
  !ssl_hash_message(hs, msg) ||
378
395
  !tls13_derive_handshake_secrets(hs) ||
379
- !tls13_set_traffic_key(ssl, evp_aead_open, hs->server_handshake_secret,
380
- hs->hash_len)) {
396
+ !tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_open,
397
+ hs->server_handshake_secret())) {
381
398
  return ssl_hs_error;
382
399
  }
383
400
 
384
401
  if (!hs->early_data_offered) {
385
402
  // If not sending early data, set client traffic keys now so that alerts are
386
403
  // encrypted.
387
- if (!tls13_set_traffic_key(ssl, evp_aead_seal, hs->client_handshake_secret,
388
- hs->hash_len)) {
404
+ if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal,
405
+ hs->client_handshake_secret())) {
389
406
  return ssl_hs_error;
390
407
  }
391
408
  }
@@ -417,26 +434,19 @@ static enum ssl_hs_wait_t do_read_encrypted_extensions(SSL_HANDSHAKE *hs) {
417
434
  }
418
435
 
419
436
  // Store the negotiated ALPN in the session.
420
- if (!ssl->s3->alpn_selected.empty()) {
421
- hs->new_session->early_alpn = (uint8_t *)BUF_memdup(
422
- ssl->s3->alpn_selected.data(), ssl->s3->alpn_selected.size());
423
- if (hs->new_session->early_alpn == NULL) {
424
- ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
425
- return ssl_hs_error;
426
- }
427
- hs->new_session->early_alpn_len = ssl->s3->alpn_selected.size();
437
+ if (!hs->new_session->early_alpn.CopyFrom(ssl->s3->alpn_selected)) {
438
+ ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
439
+ return ssl_hs_error;
428
440
  }
429
441
 
430
442
  if (ssl->s3->early_data_accepted) {
431
443
  if (hs->early_session->cipher != hs->new_session->cipher ||
432
- MakeConstSpan(hs->early_session->early_alpn,
433
- hs->early_session->early_alpn_len) !=
444
+ MakeConstSpan(hs->early_session->early_alpn) !=
434
445
  ssl->s3->alpn_selected) {
435
446
  OPENSSL_PUT_ERROR(SSL, SSL_R_ALPN_MISMATCH_ON_EARLY_DATA);
436
447
  return ssl_hs_error;
437
448
  }
438
- if (ssl->s3->tlsext_channel_id_valid || hs->received_custom_extension ||
439
- ssl->token_binding_negotiated) {
449
+ if (ssl->s3->channel_id_valid || ssl->s3->token_binding_negotiated) {
440
450
  OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION_ON_EARLY_DATA);
441
451
  return ssl_hs_error;
442
452
  }
@@ -458,6 +468,10 @@ static enum ssl_hs_wait_t do_read_certificate_request(SSL_HANDSHAKE *hs) {
458
468
  SSL *const ssl = hs->ssl;
459
469
  // CertificateRequest may only be sent in non-resumption handshakes.
460
470
  if (ssl->s3->session_reused) {
471
+ if (ssl->ctx->reverify_on_resume && !ssl->s3->early_data_accepted) {
472
+ hs->tls13_state = state_server_certificate_reverify;
473
+ return ssl_hs_ok;
474
+ }
461
475
  hs->tls13_state = state_read_server_finished;
462
476
  return ssl_hs_ok;
463
477
  }
@@ -495,7 +509,6 @@ static enum ssl_hs_wait_t do_read_certificate_request(SSL_HANDSHAKE *hs) {
495
509
  !have_sigalgs ||
496
510
  !CBS_get_u16_length_prefixed(&sigalgs,
497
511
  &supported_signature_algorithms) ||
498
- CBS_len(&supported_signature_algorithms) == 0 ||
499
512
  !tls1_parse_peer_sigalgs(hs, &supported_signature_algorithms)) {
500
513
  ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
501
514
  OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
@@ -535,8 +548,13 @@ static enum ssl_hs_wait_t do_read_server_certificate(SSL_HANDSHAKE *hs) {
535
548
  if (!ssl->method->get_message(ssl, &msg)) {
536
549
  return ssl_hs_read_message;
537
550
  }
538
- if (!ssl_check_message_type(ssl, msg, SSL3_MT_CERTIFICATE) ||
539
- !tls13_process_certificate(hs, msg, 0 /* certificate required */) ||
551
+
552
+ if (msg.type != SSL3_MT_COMPRESSED_CERTIFICATE &&
553
+ !ssl_check_message_type(ssl, msg, SSL3_MT_CERTIFICATE)) {
554
+ return ssl_hs_error;
555
+ }
556
+
557
+ if (!tls13_process_certificate(hs, msg, false /* certificate required */) ||
540
558
  !ssl_hash_message(hs, msg)) {
541
559
  return ssl_hs_error;
542
560
  }
@@ -574,6 +592,21 @@ static enum ssl_hs_wait_t do_read_server_certificate_verify(
574
592
  return ssl_hs_ok;
575
593
  }
576
594
 
595
+ static enum ssl_hs_wait_t do_server_certificate_reverify(
596
+ SSL_HANDSHAKE *hs) {
597
+ switch (ssl_reverify_peer_cert(hs)) {
598
+ case ssl_verify_ok:
599
+ break;
600
+ case ssl_verify_invalid:
601
+ return ssl_hs_error;
602
+ case ssl_verify_retry:
603
+ hs->tls13_state = state_server_certificate_reverify;
604
+ return ssl_hs_certificate_verify;
605
+ }
606
+ hs->tls13_state = state_read_server_finished;
607
+ return ssl_hs_ok;
608
+ }
609
+
577
610
  static enum ssl_hs_wait_t do_read_server_finished(SSL_HANDSHAKE *hs) {
578
611
  SSL *const ssl = hs->ssl;
579
612
  SSLMessage msg;
@@ -581,10 +614,11 @@ static enum ssl_hs_wait_t do_read_server_finished(SSL_HANDSHAKE *hs) {
581
614
  return ssl_hs_read_message;
582
615
  }
583
616
  if (!ssl_check_message_type(ssl, msg, SSL3_MT_FINISHED) ||
584
- !tls13_process_finished(hs, msg, 0 /* don't use saved value */) ||
617
+ !tls13_process_finished(hs, msg, false /* don't use saved value */) ||
585
618
  !ssl_hash_message(hs, msg) ||
586
619
  // Update the secret to the master secret and derive traffic keys.
587
- !tls13_advance_key_schedule(hs, kZeroes, hs->hash_len) ||
620
+ !tls13_advance_key_schedule(
621
+ hs, MakeConstSpan(kZeroes, hs->transcript.DigestLen())) ||
588
622
  !tls13_derive_application_secrets(hs)) {
589
623
  return ssl_hs_error;
590
624
  }
@@ -599,18 +633,22 @@ static enum ssl_hs_wait_t do_send_end_of_early_data(SSL_HANDSHAKE *hs) {
599
633
 
600
634
  if (ssl->s3->early_data_accepted) {
601
635
  hs->can_early_write = false;
602
- ScopedCBB cbb;
603
- CBB body;
604
- if (!ssl->method->init_message(ssl, cbb.get(), &body,
605
- SSL3_MT_END_OF_EARLY_DATA) ||
606
- !ssl_add_message_cbb(ssl, cbb.get())) {
607
- return ssl_hs_error;
636
+ // QUIC omits the EndOfEarlyData message. See draft-ietf-quic-tls-22,
637
+ // section 8.3.
638
+ if (ssl->quic_method == nullptr) {
639
+ ScopedCBB cbb;
640
+ CBB body;
641
+ if (!ssl->method->init_message(ssl, cbb.get(), &body,
642
+ SSL3_MT_END_OF_EARLY_DATA) ||
643
+ !ssl_add_message_cbb(ssl, cbb.get())) {
644
+ return ssl_hs_error;
645
+ }
608
646
  }
609
647
  }
610
648
 
611
649
  if (hs->early_data_offered) {
612
- if (!tls13_set_traffic_key(ssl, evp_aead_seal, hs->client_handshake_secret,
613
- hs->hash_len)) {
650
+ if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal,
651
+ hs->client_handshake_secret())) {
614
652
  return ssl_hs_error;
615
653
  }
616
654
  }
@@ -629,8 +667,8 @@ static enum ssl_hs_wait_t do_send_client_certificate(SSL_HANDSHAKE *hs) {
629
667
  }
630
668
 
631
669
  // Call cert_cb to update the certificate.
632
- if (ssl->cert->cert_cb != NULL) {
633
- int rv = ssl->cert->cert_cb(ssl, ssl->cert->cert_cb_arg);
670
+ if (hs->config->cert->cert_cb != NULL) {
671
+ int rv = hs->config->cert->cert_cb(ssl, hs->config->cert->cert_cb_arg);
634
672
  if (rv == 0) {
635
673
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
636
674
  OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR);
@@ -652,9 +690,8 @@ static enum ssl_hs_wait_t do_send_client_certificate(SSL_HANDSHAKE *hs) {
652
690
  }
653
691
 
654
692
  static enum ssl_hs_wait_t do_send_client_certificate_verify(SSL_HANDSHAKE *hs) {
655
- SSL *const ssl = hs->ssl;
656
693
  // Don't send CertificateVerify if there is no certificate.
657
- if (!ssl_has_certificate(ssl)) {
694
+ if (!ssl_has_certificate(hs)) {
658
695
  hs->tls13_state = state_complete_second_flight;
659
696
  return ssl_hs_ok;
660
697
  }
@@ -680,13 +717,13 @@ static enum ssl_hs_wait_t do_complete_second_flight(SSL_HANDSHAKE *hs) {
680
717
  SSL *const ssl = hs->ssl;
681
718
 
682
719
  // Send a Channel ID assertion if necessary.
683
- if (ssl->s3->tlsext_channel_id_valid) {
684
- if (!ssl_do_channel_id_callback(ssl)) {
720
+ if (ssl->s3->channel_id_valid) {
721
+ if (!ssl_do_channel_id_callback(hs)) {
685
722
  hs->tls13_state = state_complete_second_flight;
686
723
  return ssl_hs_error;
687
724
  }
688
725
 
689
- if (ssl->tlsext_channel_id_private == NULL) {
726
+ if (hs->config->channel_id_private == NULL) {
690
727
  return ssl_hs_channel_id_lookup;
691
728
  }
692
729
 
@@ -705,10 +742,10 @@ static enum ssl_hs_wait_t do_complete_second_flight(SSL_HANDSHAKE *hs) {
705
742
  }
706
743
 
707
744
  // Derive the final keys and enable them.
708
- if (!tls13_set_traffic_key(ssl, evp_aead_open, hs->server_traffic_secret_0,
709
- hs->hash_len) ||
710
- !tls13_set_traffic_key(ssl, evp_aead_seal, hs->client_traffic_secret_0,
711
- hs->hash_len) ||
745
+ if (!tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_open,
746
+ hs->server_traffic_secret_0()) ||
747
+ !tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_seal,
748
+ hs->client_traffic_secret_0()) ||
712
749
  !tls13_derive_resumption_secret(hs)) {
713
750
  return ssl_hs_error;
714
751
  }
@@ -744,6 +781,9 @@ enum ssl_hs_wait_t tls13_client_handshake(SSL_HANDSHAKE *hs) {
744
781
  case state_read_server_certificate_verify:
745
782
  ret = do_read_server_certificate_verify(hs);
746
783
  break;
784
+ case state_server_certificate_reverify:
785
+ ret = do_server_certificate_reverify(hs);
786
+ break;
747
787
  case state_read_server_finished:
748
788
  ret = do_read_server_finished(hs);
749
789
  break;
@@ -794,6 +834,8 @@ const char *tls13_client_handshake_state(SSL_HANDSHAKE *hs) {
794
834
  return "TLS 1.3 client read_server_certificate";
795
835
  case state_read_server_certificate_verify:
796
836
  return "TLS 1.3 client read_server_certificate_verify";
837
+ case state_server_certificate_reverify:
838
+ return "TLS 1.3 client server_certificate_reverify";
797
839
  case state_read_server_finished:
798
840
  return "TLS 1.3 client read_server_finished";
799
841
  case state_send_end_of_early_data:
@@ -811,18 +853,18 @@ const char *tls13_client_handshake_state(SSL_HANDSHAKE *hs) {
811
853
  return "TLS 1.3 client unknown";
812
854
  }
813
855
 
814
- int tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
856
+ bool tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
815
857
  if (ssl->s3->write_shutdown != ssl_shutdown_none) {
816
858
  // Ignore tickets on shutdown. Callers tend to indiscriminately call
817
859
  // |SSL_shutdown| before destroying an |SSL|, at which point calling the new
818
860
  // session callback may be confusing.
819
- return 1;
861
+ return true;
820
862
  }
821
863
 
822
864
  UniquePtr<SSL_SESSION> session = SSL_SESSION_dup(
823
865
  ssl->s3->established_session.get(), SSL_SESSION_INCLUDE_NONAUTH);
824
866
  if (!session) {
825
- return 0;
867
+ return false;
826
868
  }
827
869
 
828
870
  ssl_session_rebase_time(ssl, session.get());
@@ -833,12 +875,12 @@ int tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
833
875
  !CBS_get_u32(&body, &session->ticket_age_add) ||
834
876
  !CBS_get_u8_length_prefixed(&body, &ticket_nonce) ||
835
877
  !CBS_get_u16_length_prefixed(&body, &ticket) ||
836
- !CBS_stow(&ticket, &session->tlsext_tick, &session->tlsext_ticklen) ||
878
+ !session->ticket.CopyFrom(ticket) ||
837
879
  !CBS_get_u16_length_prefixed(&body, &extensions) ||
838
880
  CBS_len(&body) != 0) {
839
881
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
840
882
  OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
841
- return 0;
883
+ return false;
842
884
  }
843
885
 
844
886
  // Cap the renewable lifetime by the server advertised value. This avoids
@@ -848,14 +890,14 @@ int tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
848
890
  }
849
891
 
850
892
  if (!tls13_derive_session_psk(session.get(), ticket_nonce)) {
851
- return 0;
893
+ return false;
852
894
  }
853
895
 
854
896
  // Parse out the extensions.
855
- bool have_early_data_info = false;
856
- CBS early_data_info;
897
+ bool have_early_data = false;
898
+ CBS early_data;
857
899
  const SSL_EXTENSION_TYPE ext_types[] = {
858
- {TLSEXT_TYPE_early_data, &have_early_data_info, &early_data_info},
900
+ {TLSEXT_TYPE_early_data, &have_early_data, &early_data},
859
901
  };
860
902
 
861
903
  uint8_t alert = SSL_AD_DECODE_ERROR;
@@ -863,29 +905,43 @@ int tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
863
905
  OPENSSL_ARRAY_SIZE(ext_types),
864
906
  1 /* ignore unknown */)) {
865
907
  ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
866
- return 0;
908
+ return false;
867
909
  }
868
910
 
869
- if (have_early_data_info && ssl->cert->enable_early_data) {
870
- if (!CBS_get_u32(&early_data_info, &session->ticket_max_early_data) ||
871
- CBS_len(&early_data_info) != 0) {
911
+ if (have_early_data) {
912
+ if (!CBS_get_u32(&early_data, &session->ticket_max_early_data) ||
913
+ CBS_len(&early_data) != 0) {
872
914
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
873
915
  OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
874
- return 0;
916
+ return false;
917
+ }
918
+
919
+ // QUIC does not use the max_early_data_size parameter and always sets it to
920
+ // a fixed value. See draft-ietf-quic-tls-22, section 4.5.
921
+ if (ssl->quic_method != nullptr &&
922
+ session->ticket_max_early_data != 0xffffffff) {
923
+ ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
924
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
925
+ return false;
875
926
  }
876
927
  }
877
928
 
878
- session->ticket_age_add_valid = 1;
879
- session->not_resumable = 0;
929
+ // Generate a session ID for this session. Some callers expect all sessions to
930
+ // have a session ID.
931
+ SHA256(CBS_data(&ticket), CBS_len(&ticket), session->session_id);
932
+ session->session_id_length = SHA256_DIGEST_LENGTH;
933
+
934
+ session->ticket_age_add_valid = true;
935
+ session->not_resumable = false;
880
936
 
881
- if ((ssl->ctx->session_cache_mode & SSL_SESS_CACHE_CLIENT) &&
882
- ssl->ctx->new_session_cb != NULL &&
883
- ssl->ctx->new_session_cb(ssl, session.get())) {
937
+ if ((ssl->session_ctx->session_cache_mode & SSL_SESS_CACHE_CLIENT) &&
938
+ ssl->session_ctx->new_session_cb != NULL &&
939
+ ssl->session_ctx->new_session_cb(ssl, session.get())) {
884
940
  // |new_session_cb|'s return value signals that it took ownership.
885
941
  session.release();
886
942
  }
887
943
 
888
- return 1;
944
+ return true;
889
945
  }
890
946
 
891
- } // namespace bssl
947
+ BSSL_NAMESPACE_END
@@ -17,6 +17,7 @@
17
17
  #include <assert.h>
18
18
  #include <string.h>
19
19
 
20
+ #include <algorithm>
20
21
  #include <utility>
21
22
 
22
23
  #include <openssl/aead.h>
@@ -30,181 +31,196 @@
30
31
  #include "internal.h"
31
32
 
32
33
 
33
- namespace bssl {
34
+ BSSL_NAMESPACE_BEGIN
34
35
 
35
- static int init_key_schedule(SSL_HANDSHAKE *hs, uint16_t version,
36
- const SSL_CIPHER *cipher) {
36
+ static bool init_key_schedule(SSL_HANDSHAKE *hs, uint16_t version,
37
+ const SSL_CIPHER *cipher) {
37
38
  if (!hs->transcript.InitHash(version, cipher)) {
38
- return 0;
39
+ return false;
39
40
  }
40
41
 
41
- hs->hash_len = hs->transcript.DigestLen();
42
-
43
42
  // Initialize the secret to the zero key.
44
- OPENSSL_memset(hs->secret, 0, hs->hash_len);
43
+ hs->ResizeSecrets(hs->transcript.DigestLen());
44
+ OPENSSL_memset(hs->secret().data(), 0, hs->secret().size());
45
45
 
46
- return 1;
46
+ return true;
47
+ }
48
+
49
+ static bool hkdf_extract_to_secret(SSL_HANDSHAKE *hs, Span<const uint8_t> in) {
50
+ size_t len;
51
+ if (!HKDF_extract(hs->secret().data(), &len, hs->transcript.Digest(),
52
+ in.data(), in.size(), hs->secret().data(),
53
+ hs->secret().size())) {
54
+ return false;
55
+ }
56
+ assert(len == hs->secret().size());
57
+ return true;
47
58
  }
48
59
 
49
- int tls13_init_key_schedule(SSL_HANDSHAKE *hs, const uint8_t *psk,
50
- size_t psk_len) {
60
+ bool tls13_init_key_schedule(SSL_HANDSHAKE *hs, Span<const uint8_t> psk) {
51
61
  if (!init_key_schedule(hs, ssl_protocol_version(hs->ssl), hs->new_cipher)) {
52
- return 0;
62
+ return false;
53
63
  }
54
64
 
55
65
  hs->transcript.FreeBuffer();
56
- return HKDF_extract(hs->secret, &hs->hash_len, hs->transcript.Digest(), psk,
57
- psk_len, hs->secret, hs->hash_len);
66
+ return hkdf_extract_to_secret(hs, psk);
58
67
  }
59
68
 
60
- int tls13_init_early_key_schedule(SSL_HANDSHAKE *hs, const uint8_t *psk,
61
- size_t psk_len) {
69
+ bool tls13_init_early_key_schedule(SSL_HANDSHAKE *hs, Span<const uint8_t> psk) {
62
70
  SSL *const ssl = hs->ssl;
63
- return init_key_schedule(hs, ssl_session_protocol_version(ssl->session),
71
+ return init_key_schedule(hs, ssl_session_protocol_version(ssl->session.get()),
64
72
  ssl->session->cipher) &&
65
- HKDF_extract(hs->secret, &hs->hash_len, hs->transcript.Digest(), psk,
66
- psk_len, hs->secret, hs->hash_len);
73
+ hkdf_extract_to_secret(hs, psk);
67
74
  }
68
75
 
69
- static int hkdf_expand_label(uint8_t *out, const EVP_MD *digest,
70
- const uint8_t *secret, size_t secret_len,
71
- const char *label, size_t label_len,
72
- const uint8_t *hash, size_t hash_len, size_t len) {
73
- static const char kTLS13LabelVersion[] = "tls13 ";
76
+ static Span<const char> label_to_span(const char *label) {
77
+ return MakeConstSpan(label, strlen(label));
78
+ }
74
79
 
80
+ static bool hkdf_expand_label(Span<uint8_t> out, const EVP_MD *digest,
81
+ Span<const uint8_t> secret,
82
+ Span<const char> label,
83
+ Span<const uint8_t> hash) {
84
+ Span<const char> protocol_label = label_to_span("tls13 ");
75
85
  ScopedCBB cbb;
76
86
  CBB child;
77
- uint8_t *hkdf_label;
78
- size_t hkdf_label_len;
79
- if (!CBB_init(cbb.get(), 2 + 1 + strlen(kTLS13LabelVersion) + label_len + 1 +
80
- hash_len) ||
81
- !CBB_add_u16(cbb.get(), len) ||
87
+ Array<uint8_t> hkdf_label;
88
+ if (!CBB_init(cbb.get(), 2 + 1 + protocol_label.size() + label.size() + 1 +
89
+ hash.size()) ||
90
+ !CBB_add_u16(cbb.get(), out.size()) ||
82
91
  !CBB_add_u8_length_prefixed(cbb.get(), &child) ||
83
- !CBB_add_bytes(&child, (const uint8_t *)kTLS13LabelVersion,
84
- strlen(kTLS13LabelVersion)) ||
85
- !CBB_add_bytes(&child, (const uint8_t *)label, label_len) ||
92
+ !CBB_add_bytes(&child,
93
+ reinterpret_cast<const uint8_t *>(protocol_label.data()),
94
+ protocol_label.size()) ||
95
+ !CBB_add_bytes(&child, reinterpret_cast<const uint8_t *>(label.data()),
96
+ label.size()) ||
86
97
  !CBB_add_u8_length_prefixed(cbb.get(), &child) ||
87
- !CBB_add_bytes(&child, hash, hash_len) ||
88
- !CBB_finish(cbb.get(), &hkdf_label, &hkdf_label_len)) {
89
- return 0;
98
+ !CBB_add_bytes(&child, hash.data(), hash.size()) ||
99
+ !CBBFinishArray(cbb.get(), &hkdf_label)) {
100
+ return false;
90
101
  }
91
102
 
92
- int ret = HKDF_expand(out, len, digest, secret, secret_len, hkdf_label,
93
- hkdf_label_len);
94
- OPENSSL_free(hkdf_label);
95
- return ret;
103
+ return HKDF_expand(out.data(), out.size(), digest, secret.data(),
104
+ secret.size(), hkdf_label.data(), hkdf_label.size());
96
105
  }
97
106
 
98
107
  static const char kTLS13LabelDerived[] = "derived";
99
108
 
100
- int tls13_advance_key_schedule(SSL_HANDSHAKE *hs, const uint8_t *in,
101
- size_t len) {
109
+ bool tls13_advance_key_schedule(SSL_HANDSHAKE *hs, Span<const uint8_t> in) {
102
110
  uint8_t derive_context[EVP_MAX_MD_SIZE];
103
111
  unsigned derive_context_len;
104
- if (!EVP_Digest(nullptr, 0, derive_context, &derive_context_len,
105
- hs->transcript.Digest(), nullptr)) {
106
- return 0;
107
- }
108
-
109
- if (!hkdf_expand_label(hs->secret, hs->transcript.Digest(), hs->secret,
110
- hs->hash_len, kTLS13LabelDerived,
111
- strlen(kTLS13LabelDerived), derive_context,
112
- derive_context_len, hs->hash_len)) {
113
- return 0;
114
- }
115
-
116
- return HKDF_extract(hs->secret, &hs->hash_len, hs->transcript.Digest(), in,
117
- len, hs->secret, hs->hash_len);
112
+ return EVP_Digest(nullptr, 0, derive_context, &derive_context_len,
113
+ hs->transcript.Digest(), nullptr) &&
114
+ hkdf_expand_label(hs->secret(), hs->transcript.Digest(), hs->secret(),
115
+ label_to_span(kTLS13LabelDerived),
116
+ MakeConstSpan(derive_context, derive_context_len)) &&
117
+ hkdf_extract_to_secret(hs, in);
118
118
  }
119
119
 
120
- // derive_secret derives a secret of length |len| and writes the result in |out|
121
- // with the given label and the current base secret and most recently-saved
122
- // handshake context. It returns one on success and zero on error.
123
- static int derive_secret(SSL_HANDSHAKE *hs, uint8_t *out, size_t len,
124
- const char *label, size_t label_len) {
120
+ // derive_secret derives a secret of length |out.size()| and writes the result
121
+ // in |out| with the given label, the current base secret, and the most
122
+ // recently-saved handshake context. It returns true on success and false on
123
+ // error.
124
+ static bool derive_secret(SSL_HANDSHAKE *hs, Span<uint8_t> out,
125
+ Span<const char> label) {
125
126
  uint8_t context_hash[EVP_MAX_MD_SIZE];
126
127
  size_t context_hash_len;
127
128
  if (!hs->transcript.GetHash(context_hash, &context_hash_len)) {
128
- return 0;
129
+ return false;
129
130
  }
130
131
 
131
- return hkdf_expand_label(out, hs->transcript.Digest(), hs->secret,
132
- hs->hash_len, label, label_len, context_hash,
133
- context_hash_len, len);
132
+ return hkdf_expand_label(out, hs->transcript.Digest(), hs->secret(), label,
133
+ MakeConstSpan(context_hash, context_hash_len));
134
134
  }
135
135
 
136
- int tls13_set_traffic_key(SSL *ssl, enum evp_aead_direction_t direction,
137
- const uint8_t *traffic_secret,
138
- size_t traffic_secret_len) {
136
+ bool tls13_set_traffic_key(SSL *ssl, enum ssl_encryption_level_t level,
137
+ enum evp_aead_direction_t direction,
138
+ Span<const uint8_t> traffic_secret) {
139
139
  const SSL_SESSION *session = SSL_get_session(ssl);
140
140
  uint16_t version = ssl_session_protocol_version(session);
141
141
 
142
- if (traffic_secret_len > 0xff) {
143
- OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
144
- return 0;
145
- }
142
+ UniquePtr<SSLAEADContext> traffic_aead;
143
+ if (ssl->quic_method == nullptr) {
144
+ // Look up cipher suite properties.
145
+ const EVP_AEAD *aead;
146
+ size_t discard;
147
+ if (!ssl_cipher_get_evp_aead(&aead, &discard, &discard, session->cipher,
148
+ version, SSL_is_dtls(ssl))) {
149
+ return false;
150
+ }
146
151
 
147
- // Look up cipher suite properties.
148
- const EVP_AEAD *aead;
149
- size_t discard;
150
- if (!ssl_cipher_get_evp_aead(&aead, &discard, &discard, session->cipher,
151
- version, SSL_is_dtls(ssl))) {
152
- return 0;
153
- }
152
+ const EVP_MD *digest = ssl_session_get_digest(session);
154
153
 
155
- const EVP_MD *digest = ssl_session_get_digest(session);
154
+ // Derive the key.
155
+ size_t key_len = EVP_AEAD_key_length(aead);
156
+ uint8_t key_buf[EVP_AEAD_MAX_KEY_LENGTH];
157
+ auto key = MakeSpan(key_buf, key_len);
158
+ if (!hkdf_expand_label(key, digest, traffic_secret, label_to_span("key"),
159
+ {})) {
160
+ return false;
161
+ }
156
162
 
157
- // Derive the key.
158
- size_t key_len = EVP_AEAD_key_length(aead);
159
- uint8_t key[EVP_AEAD_MAX_KEY_LENGTH];
160
- if (!hkdf_expand_label(key, digest, traffic_secret, traffic_secret_len, "key",
161
- 3, NULL, 0, key_len)) {
162
- return 0;
163
- }
163
+ // Derive the IV.
164
+ size_t iv_len = EVP_AEAD_nonce_length(aead);
165
+ uint8_t iv_buf[EVP_AEAD_MAX_NONCE_LENGTH];
166
+ auto iv = MakeSpan(iv_buf, iv_len);
167
+ if (!hkdf_expand_label(iv, digest, traffic_secret, label_to_span("iv"),
168
+ {})) {
169
+ return false;
170
+ }
164
171
 
165
- // Derive the IV.
166
- size_t iv_len = EVP_AEAD_nonce_length(aead);
167
- uint8_t iv[EVP_AEAD_MAX_NONCE_LENGTH];
168
- if (!hkdf_expand_label(iv, digest, traffic_secret, traffic_secret_len, "iv",
169
- 2, NULL, 0, iv_len)) {
170
- return 0;
172
+
173
+ traffic_aead = SSLAEADContext::Create(direction, session->ssl_version,
174
+ SSL_is_dtls(ssl), session->cipher,
175
+ key, Span<const uint8_t>(), iv);
176
+ } else {
177
+ // Install a placeholder SSLAEADContext so that SSL accessors work. The
178
+ // encryption itself will be handled by the SSL_QUIC_METHOD.
179
+ traffic_aead =
180
+ SSLAEADContext::CreatePlaceholderForQUIC(version, session->cipher);
181
+ // QUIC never installs early data keys at the TLS layer.
182
+ assert(level != ssl_encryption_early_data);
171
183
  }
172
184
 
173
- UniquePtr<SSLAEADContext> traffic_aead =
174
- SSLAEADContext::Create(direction, session->ssl_version, SSL_is_dtls(ssl),
175
- session->cipher, MakeConstSpan(key, key_len),
176
- Span<const uint8_t>(), MakeConstSpan(iv, iv_len));
177
185
  if (!traffic_aead) {
178
- return 0;
186
+ return false;
179
187
  }
180
188
 
181
189
  if (direction == evp_aead_open) {
182
190
  if (!ssl->method->set_read_state(ssl, std::move(traffic_aead))) {
183
- return 0;
191
+ return false;
184
192
  }
185
193
  } else {
186
194
  if (!ssl->method->set_write_state(ssl, std::move(traffic_aead))) {
187
- return 0;
195
+ return false;
188
196
  }
189
197
  }
190
198
 
191
199
  // Save the traffic secret.
200
+ if (traffic_secret.size() >
201
+ OPENSSL_ARRAY_SIZE(ssl->s3->read_traffic_secret) ||
202
+ traffic_secret.size() >
203
+ OPENSSL_ARRAY_SIZE(ssl->s3->write_traffic_secret)) {
204
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
205
+ return false;
206
+ }
192
207
  if (direction == evp_aead_open) {
193
- OPENSSL_memmove(ssl->s3->read_traffic_secret, traffic_secret,
194
- traffic_secret_len);
195
- ssl->s3->read_traffic_secret_len = traffic_secret_len;
208
+ OPENSSL_memmove(ssl->s3->read_traffic_secret, traffic_secret.data(),
209
+ traffic_secret.size());
210
+ ssl->s3->read_traffic_secret_len = traffic_secret.size();
211
+ ssl->s3->read_level = level;
196
212
  } else {
197
- OPENSSL_memmove(ssl->s3->write_traffic_secret, traffic_secret,
198
- traffic_secret_len);
199
- ssl->s3->write_traffic_secret_len = traffic_secret_len;
213
+ OPENSSL_memmove(ssl->s3->write_traffic_secret, traffic_secret.data(),
214
+ traffic_secret.size());
215
+ ssl->s3->write_traffic_secret_len = traffic_secret.size();
216
+ ssl->s3->write_level = level;
200
217
  }
201
218
 
202
- return 1;
219
+ return true;
203
220
  }
204
221
 
205
222
 
206
223
  static const char kTLS13LabelExporter[] = "exp master";
207
- static const char kTLS13LabelEarlyExporter[] = "e exp master";
208
224
 
209
225
  static const char kTLS13LabelClientEarlyTraffic[] = "c e traffic";
210
226
  static const char kTLS13LabelClientHandshakeTraffic[] = "c hs traffic";
@@ -212,125 +228,169 @@ static const char kTLS13LabelServerHandshakeTraffic[] = "s hs traffic";
212
228
  static const char kTLS13LabelClientApplicationTraffic[] = "c ap traffic";
213
229
  static const char kTLS13LabelServerApplicationTraffic[] = "s ap traffic";
214
230
 
215
- int tls13_derive_early_secrets(SSL_HANDSHAKE *hs) {
231
+ bool tls13_derive_early_secret(SSL_HANDSHAKE *hs) {
216
232
  SSL *const ssl = hs->ssl;
217
- if (!derive_secret(hs, hs->early_traffic_secret, hs->hash_len,
218
- kTLS13LabelClientEarlyTraffic,
219
- strlen(kTLS13LabelClientEarlyTraffic)) ||
233
+ if (!derive_secret(hs, hs->early_traffic_secret(),
234
+ label_to_span(kTLS13LabelClientEarlyTraffic)) ||
220
235
  !ssl_log_secret(ssl, "CLIENT_EARLY_TRAFFIC_SECRET",
221
- hs->early_traffic_secret, hs->hash_len) ||
222
- !derive_secret(hs, ssl->s3->early_exporter_secret, hs->hash_len,
223
- kTLS13LabelEarlyExporter,
224
- strlen(kTLS13LabelEarlyExporter))) {
225
- return 0;
236
+ hs->early_traffic_secret())) {
237
+ return false;
226
238
  }
227
- ssl->s3->early_exporter_secret_len = hs->hash_len;
228
- return 1;
239
+ return true;
240
+ }
241
+
242
+ bool tls13_set_early_secret_for_quic(SSL_HANDSHAKE *hs) {
243
+ SSL *const ssl = hs->ssl;
244
+ if (ssl->quic_method == nullptr) {
245
+ return true;
246
+ }
247
+ if (ssl->server) {
248
+ if (!ssl->quic_method->set_encryption_secrets(
249
+ ssl, ssl_encryption_early_data, hs->early_traffic_secret().data(),
250
+ /*write_secret=*/nullptr, hs->early_traffic_secret().size())) {
251
+ OPENSSL_PUT_ERROR(SSL, SSL_R_QUIC_INTERNAL_ERROR);
252
+ return false;
253
+ }
254
+ } else {
255
+ if (!ssl->quic_method->set_encryption_secrets(
256
+ ssl, ssl_encryption_early_data, /*read_secret=*/nullptr,
257
+ hs->early_traffic_secret().data(),
258
+ hs->early_traffic_secret().size())) {
259
+ OPENSSL_PUT_ERROR(SSL, SSL_R_QUIC_INTERNAL_ERROR);
260
+ return false;
261
+ }
262
+ }
263
+ return true;
264
+ }
265
+
266
+ static bool set_quic_secrets(SSL_HANDSHAKE *hs, ssl_encryption_level_t level,
267
+ Span<const uint8_t> client_write_secret,
268
+ Span<const uint8_t> server_write_secret) {
269
+ SSL *const ssl = hs->ssl;
270
+ assert(client_write_secret.size() == server_write_secret.size());
271
+ if (ssl->quic_method == nullptr) {
272
+ return true;
273
+ }
274
+ if (!ssl->server) {
275
+ std::swap(client_write_secret, server_write_secret);
276
+ }
277
+ return ssl->quic_method->set_encryption_secrets(
278
+ ssl, level,
279
+ /*read_secret=*/client_write_secret.data(),
280
+ /*write_secret=*/server_write_secret.data(), client_write_secret.size());
229
281
  }
230
282
 
231
- int tls13_derive_handshake_secrets(SSL_HANDSHAKE *hs) {
283
+ bool tls13_derive_handshake_secrets(SSL_HANDSHAKE *hs) {
232
284
  SSL *const ssl = hs->ssl;
233
- return derive_secret(hs, hs->client_handshake_secret, hs->hash_len,
234
- kTLS13LabelClientHandshakeTraffic,
235
- strlen(kTLS13LabelClientHandshakeTraffic)) &&
236
- ssl_log_secret(ssl, "CLIENT_HANDSHAKE_TRAFFIC_SECRET",
237
- hs->client_handshake_secret, hs->hash_len) &&
238
- derive_secret(hs, hs->server_handshake_secret, hs->hash_len,
239
- kTLS13LabelServerHandshakeTraffic,
240
- strlen(kTLS13LabelServerHandshakeTraffic)) &&
241
- ssl_log_secret(ssl, "SERVER_HANDSHAKE_TRAFFIC_SECRET",
242
- hs->server_handshake_secret, hs->hash_len);
285
+ if (!derive_secret(hs, hs->client_handshake_secret(),
286
+ label_to_span(kTLS13LabelClientHandshakeTraffic)) ||
287
+ !ssl_log_secret(ssl, "CLIENT_HANDSHAKE_TRAFFIC_SECRET",
288
+ hs->client_handshake_secret()) ||
289
+ !derive_secret(hs, hs->server_handshake_secret(),
290
+ label_to_span(kTLS13LabelServerHandshakeTraffic)) ||
291
+ !ssl_log_secret(ssl, "SERVER_HANDSHAKE_TRAFFIC_SECRET",
292
+ hs->server_handshake_secret()) ||
293
+ !set_quic_secrets(hs, ssl_encryption_handshake,
294
+ hs->client_handshake_secret(),
295
+ hs->server_handshake_secret())) {
296
+ return false;
297
+ }
298
+
299
+ return true;
243
300
  }
244
301
 
245
- int tls13_derive_application_secrets(SSL_HANDSHAKE *hs) {
302
+ bool tls13_derive_application_secrets(SSL_HANDSHAKE *hs) {
246
303
  SSL *const ssl = hs->ssl;
247
- ssl->s3->exporter_secret_len = hs->hash_len;
248
- return derive_secret(hs, hs->client_traffic_secret_0, hs->hash_len,
249
- kTLS13LabelClientApplicationTraffic,
250
- strlen(kTLS13LabelClientApplicationTraffic)) &&
251
- ssl_log_secret(ssl, "CLIENT_TRAFFIC_SECRET_0",
252
- hs->client_traffic_secret_0, hs->hash_len) &&
253
- derive_secret(hs, hs->server_traffic_secret_0, hs->hash_len,
254
- kTLS13LabelServerApplicationTraffic,
255
- strlen(kTLS13LabelServerApplicationTraffic)) &&
256
- ssl_log_secret(ssl, "SERVER_TRAFFIC_SECRET_0",
257
- hs->server_traffic_secret_0, hs->hash_len) &&
258
- derive_secret(hs, ssl->s3->exporter_secret, hs->hash_len,
259
- kTLS13LabelExporter, strlen(kTLS13LabelExporter)) &&
260
- ssl_log_secret(ssl, "EXPORTER_SECRET", ssl->s3->exporter_secret,
261
- hs->hash_len);
304
+ ssl->s3->exporter_secret_len = hs->transcript.DigestLen();
305
+ if (!derive_secret(hs, hs->client_traffic_secret_0(),
306
+ label_to_span(kTLS13LabelClientApplicationTraffic)) ||
307
+ !ssl_log_secret(ssl, "CLIENT_TRAFFIC_SECRET_0",
308
+ hs->client_traffic_secret_0()) ||
309
+ !derive_secret(hs, hs->server_traffic_secret_0(),
310
+ label_to_span(kTLS13LabelServerApplicationTraffic)) ||
311
+ !ssl_log_secret(ssl, "SERVER_TRAFFIC_SECRET_0",
312
+ hs->server_traffic_secret_0()) ||
313
+ !derive_secret(
314
+ hs, MakeSpan(ssl->s3->exporter_secret, ssl->s3->exporter_secret_len),
315
+ label_to_span(kTLS13LabelExporter)) ||
316
+ !ssl_log_secret(ssl, "EXPORTER_SECRET",
317
+ MakeConstSpan(ssl->s3->exporter_secret,
318
+ ssl->s3->exporter_secret_len)) ||
319
+ !set_quic_secrets(hs, ssl_encryption_application,
320
+ hs->client_traffic_secret_0(),
321
+ hs->server_traffic_secret_0())) {
322
+ return false;
323
+ }
324
+
325
+ return true;
262
326
  }
263
327
 
264
328
  static const char kTLS13LabelApplicationTraffic[] = "traffic upd";
265
329
 
266
- int tls13_rotate_traffic_key(SSL *ssl, enum evp_aead_direction_t direction) {
267
- uint8_t *secret;
268
- size_t secret_len;
330
+ bool tls13_rotate_traffic_key(SSL *ssl, enum evp_aead_direction_t direction) {
331
+ Span<uint8_t> secret;
269
332
  if (direction == evp_aead_open) {
270
- secret = ssl->s3->read_traffic_secret;
271
- secret_len = ssl->s3->read_traffic_secret_len;
333
+ secret = MakeSpan(ssl->s3->read_traffic_secret,
334
+ ssl->s3->read_traffic_secret_len);
272
335
  } else {
273
- secret = ssl->s3->write_traffic_secret;
274
- secret_len = ssl->s3->write_traffic_secret_len;
336
+ secret = MakeSpan(ssl->s3->write_traffic_secret,
337
+ ssl->s3->write_traffic_secret_len);
275
338
  }
276
339
 
277
340
  const EVP_MD *digest = ssl_session_get_digest(SSL_get_session(ssl));
278
- if (!hkdf_expand_label(
279
- secret, digest, secret, secret_len, kTLS13LabelApplicationTraffic,
280
- strlen(kTLS13LabelApplicationTraffic), NULL, 0, secret_len)) {
281
- return 0;
282
- }
283
-
284
- return tls13_set_traffic_key(ssl, direction, secret, secret_len);
341
+ return hkdf_expand_label(secret, digest, secret,
342
+ label_to_span(kTLS13LabelApplicationTraffic), {}) &&
343
+ tls13_set_traffic_key(ssl, ssl_encryption_application, direction,
344
+ secret);
285
345
  }
286
346
 
287
347
  static const char kTLS13LabelResumption[] = "res master";
288
348
 
289
- int tls13_derive_resumption_secret(SSL_HANDSHAKE *hs) {
290
- if (hs->hash_len > SSL_MAX_MASTER_KEY_LENGTH) {
349
+ bool tls13_derive_resumption_secret(SSL_HANDSHAKE *hs) {
350
+ if (hs->transcript.DigestLen() > SSL_MAX_MASTER_KEY_LENGTH) {
291
351
  OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
292
- return 0;
352
+ return false;
293
353
  }
294
- hs->new_session->master_key_length = hs->hash_len;
295
- return derive_secret(hs, hs->new_session->master_key,
296
- hs->new_session->master_key_length,
297
- kTLS13LabelResumption, strlen(kTLS13LabelResumption));
354
+ hs->new_session->master_key_length = hs->transcript.DigestLen();
355
+ return derive_secret(
356
+ hs,
357
+ MakeSpan(hs->new_session->master_key, hs->new_session->master_key_length),
358
+ label_to_span(kTLS13LabelResumption));
298
359
  }
299
360
 
300
361
  static const char kTLS13LabelFinished[] = "finished";
301
362
 
302
363
  // tls13_verify_data sets |out| to be the HMAC of |context| using a derived
303
- // Finished key for both Finished messages and the PSK binder.
304
- static int tls13_verify_data(const EVP_MD *digest, uint16_t version,
305
- uint8_t *out, size_t *out_len,
306
- const uint8_t *secret, size_t hash_len,
307
- uint8_t *context, size_t context_len) {
308
- uint8_t key[EVP_MAX_MD_SIZE];
364
+ // Finished key for both Finished messages and the PSK binder. |out| must have
365
+ // space available for |EVP_MAX_MD_SIZE| bytes.
366
+ static bool tls13_verify_data(uint8_t *out, size_t *out_len,
367
+ const EVP_MD *digest, uint16_t version,
368
+ Span<const uint8_t> secret,
369
+ Span<const uint8_t> context) {
370
+ uint8_t key_buf[EVP_MAX_MD_SIZE];
371
+ auto key = MakeSpan(key_buf, EVP_MD_size(digest));
309
372
  unsigned len;
310
- if (!hkdf_expand_label(key, digest, secret, hash_len, kTLS13LabelFinished,
311
- strlen(kTLS13LabelFinished), NULL, 0, hash_len) ||
312
- HMAC(digest, key, hash_len, context, context_len, out, &len) == NULL) {
313
- return 0;
373
+ if (!hkdf_expand_label(key, digest, secret,
374
+ label_to_span(kTLS13LabelFinished), {}) ||
375
+ HMAC(digest, key.data(), key.size(), context.data(), context.size(), out,
376
+ &len) == nullptr) {
377
+ return false;
314
378
  }
315
379
  *out_len = len;
316
- return 1;
380
+ return true;
317
381
  }
318
382
 
319
- int tls13_finished_mac(SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len,
320
- int is_server) {
321
- const uint8_t *traffic_secret;
322
- if (is_server) {
323
- traffic_secret = hs->server_handshake_secret;
324
- } else {
325
- traffic_secret = hs->client_handshake_secret;
326
- }
383
+ bool tls13_finished_mac(SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len,
384
+ bool is_server) {
385
+ Span<const uint8_t> traffic_secret =
386
+ is_server ? hs->server_handshake_secret() : hs->client_handshake_secret();
327
387
 
328
388
  uint8_t context_hash[EVP_MAX_MD_SIZE];
329
389
  size_t context_hash_len;
330
390
  if (!hs->transcript.GetHash(context_hash, &context_hash_len) ||
331
- !tls13_verify_data(hs->transcript.Digest(), hs->ssl->version, out,
332
- out_len, traffic_secret, hs->hash_len, context_hash,
333
- context_hash_len)) {
391
+ !tls13_verify_data(out, out_len, hs->transcript.Digest(),
392
+ hs->ssl->version, traffic_secret,
393
+ MakeConstSpan(context_hash, context_hash_len))) {
334
394
  return 0;
335
395
  }
336
396
  return 1;
@@ -340,154 +400,162 @@ static const char kTLS13LabelResumptionPSK[] = "resumption";
340
400
 
341
401
  bool tls13_derive_session_psk(SSL_SESSION *session, Span<const uint8_t> nonce) {
342
402
  const EVP_MD *digest = ssl_session_get_digest(session);
343
- return hkdf_expand_label(session->master_key, digest, session->master_key,
344
- session->master_key_length, kTLS13LabelResumptionPSK,
345
- strlen(kTLS13LabelResumptionPSK), nonce.data(),
346
- nonce.size(), session->master_key_length);
403
+ // The session initially stores the resumption_master_secret, which we
404
+ // override with the PSK.
405
+ auto session_key = MakeSpan(session->master_key, session->master_key_length);
406
+ return hkdf_expand_label(session_key, digest, session_key,
407
+ label_to_span(kTLS13LabelResumptionPSK), nonce);
347
408
  }
348
409
 
349
410
  static const char kTLS13LabelExportKeying[] = "exporter";
350
411
 
351
- int tls13_export_keying_material(SSL *ssl, Span<uint8_t> out,
352
- Span<const uint8_t> secret,
353
- Span<const char> label,
354
- Span<const uint8_t> context) {
412
+ bool tls13_export_keying_material(SSL *ssl, Span<uint8_t> out,
413
+ Span<const uint8_t> secret,
414
+ Span<const char> label,
415
+ Span<const uint8_t> context) {
355
416
  if (secret.empty()) {
356
417
  assert(0);
357
418
  OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
358
- return 0;
419
+ return false;
359
420
  }
360
421
 
361
422
  const EVP_MD *digest = ssl_session_get_digest(SSL_get_session(ssl));
362
423
 
363
- uint8_t hash[EVP_MAX_MD_SIZE];
364
- uint8_t export_context[EVP_MAX_MD_SIZE];
365
- uint8_t derived_secret[EVP_MAX_MD_SIZE];
424
+ uint8_t hash_buf[EVP_MAX_MD_SIZE];
425
+ uint8_t export_context_buf[EVP_MAX_MD_SIZE];
366
426
  unsigned hash_len;
367
427
  unsigned export_context_len;
368
- unsigned derived_secret_len = EVP_MD_size(digest);
369
- return EVP_Digest(context.data(), context.size(), hash, &hash_len, digest,
370
- nullptr) &&
371
- EVP_Digest(nullptr, 0, export_context, &export_context_len, digest,
372
- nullptr) &&
373
- hkdf_expand_label(derived_secret, digest, secret.data(), secret.size(),
374
- label.data(), label.size(), export_context,
375
- export_context_len, derived_secret_len) &&
376
- hkdf_expand_label(out.data(), digest, derived_secret,
377
- derived_secret_len, kTLS13LabelExportKeying,
378
- strlen(kTLS13LabelExportKeying), hash, hash_len,
379
- out.size());
428
+ if (!EVP_Digest(context.data(), context.size(), hash_buf, &hash_len, digest,
429
+ nullptr) ||
430
+ !EVP_Digest(nullptr, 0, export_context_buf, &export_context_len, digest,
431
+ nullptr)) {
432
+ return false;
433
+ }
434
+
435
+ auto hash = MakeConstSpan(hash_buf, hash_len);
436
+ auto export_context = MakeConstSpan(export_context_buf, export_context_len);
437
+ uint8_t derived_secret_buf[EVP_MAX_MD_SIZE];
438
+ auto derived_secret = MakeSpan(derived_secret_buf, EVP_MD_size(digest));
439
+ return hkdf_expand_label(derived_secret, digest, secret, label,
440
+ export_context) &&
441
+ hkdf_expand_label(out, digest, derived_secret,
442
+ label_to_span(kTLS13LabelExportKeying), hash);
380
443
  }
381
444
 
382
445
  static const char kTLS13LabelPSKBinder[] = "res binder";
383
446
 
384
- static int tls13_psk_binder(uint8_t *out, uint16_t version,
385
- const EVP_MD *digest, uint8_t *psk, size_t psk_len,
386
- uint8_t *context, size_t context_len,
387
- size_t hash_len) {
447
+ static bool tls13_psk_binder(uint8_t *out, size_t *out_len, uint16_t version,
448
+ const EVP_MD *digest, Span<const uint8_t> psk,
449
+ Span<const uint8_t> context) {
388
450
  uint8_t binder_context[EVP_MAX_MD_SIZE];
389
451
  unsigned binder_context_len;
390
452
  if (!EVP_Digest(NULL, 0, binder_context, &binder_context_len, digest, NULL)) {
391
- return 0;
453
+ return false;
392
454
  }
393
455
 
394
456
  uint8_t early_secret[EVP_MAX_MD_SIZE] = {0};
395
457
  size_t early_secret_len;
396
- if (!HKDF_extract(early_secret, &early_secret_len, digest, psk, hash_len,
397
- NULL, 0)) {
398
- return 0;
458
+ if (!HKDF_extract(early_secret, &early_secret_len, digest, psk.data(),
459
+ psk.size(), NULL, 0)) {
460
+ return false;
399
461
  }
400
462
 
401
- uint8_t binder_key[EVP_MAX_MD_SIZE] = {0};
402
- size_t len;
403
- if (!hkdf_expand_label(binder_key, digest, early_secret, hash_len,
404
- kTLS13LabelPSKBinder, strlen(kTLS13LabelPSKBinder),
405
- binder_context, binder_context_len, hash_len) ||
406
- !tls13_verify_data(digest, version, out, &len, binder_key, hash_len,
407
- context, context_len)) {
408
- return 0;
463
+ uint8_t binder_key_buf[EVP_MAX_MD_SIZE] = {0};
464
+ auto binder_key = MakeSpan(binder_key_buf, EVP_MD_size(digest));
465
+ if (!hkdf_expand_label(binder_key, digest,
466
+ MakeConstSpan(early_secret, early_secret_len),
467
+ label_to_span(kTLS13LabelPSKBinder),
468
+ MakeConstSpan(binder_context, binder_context_len)) ||
469
+ !tls13_verify_data(out, out_len, digest, version, binder_key, context)) {
470
+ return false;
409
471
  }
410
472
 
411
- return 1;
473
+ assert(*out_len == EVP_MD_size(digest));
474
+ return true;
412
475
  }
413
476
 
414
- int tls13_write_psk_binder(SSL_HANDSHAKE *hs, uint8_t *msg, size_t len) {
415
- SSL *const ssl = hs->ssl;
416
- const EVP_MD *digest = ssl_session_get_digest(ssl->session);
417
- size_t hash_len = EVP_MD_size(digest);
418
-
419
- if (len < hash_len + 3) {
420
- OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
421
- return 0;
477
+ static bool hash_transcript_and_truncated_client_hello(
478
+ SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len, const EVP_MD *digest,
479
+ Span<const uint8_t> client_hello, size_t binders_len) {
480
+ // Truncate the ClientHello.
481
+ if (binders_len + 2 < binders_len || client_hello.size() < binders_len + 2) {
482
+ return false;
422
483
  }
484
+ client_hello = client_hello.subspan(0, client_hello.size() - binders_len - 2);
423
485
 
424
486
  ScopedEVP_MD_CTX ctx;
425
- uint8_t context[EVP_MAX_MD_SIZE];
426
- unsigned context_len;
427
-
428
- if (!EVP_DigestInit_ex(ctx.get(), digest, NULL) ||
429
- !EVP_DigestUpdate(ctx.get(), hs->transcript.buffer().data(),
430
- hs->transcript.buffer().size()) ||
431
- !EVP_DigestUpdate(ctx.get(), msg, len - hash_len - 3) ||
432
- !EVP_DigestFinal_ex(ctx.get(), context, &context_len)) {
433
- return 0;
434
- }
435
-
436
- uint8_t verify_data[EVP_MAX_MD_SIZE] = {0};
437
- if (!tls13_psk_binder(verify_data, ssl->session->ssl_version, digest,
438
- ssl->session->master_key,
439
- ssl->session->master_key_length, context, context_len,
440
- hash_len)) {
441
- return 0;
487
+ unsigned len;
488
+ if (!hs->transcript.CopyToHashContext(ctx.get(), digest) ||
489
+ !EVP_DigestUpdate(ctx.get(), client_hello.data(), client_hello.size()) ||
490
+ !EVP_DigestFinal_ex(ctx.get(), out, &len)) {
491
+ return false;
442
492
  }
443
493
 
444
- OPENSSL_memcpy(msg + len - hash_len, verify_data, hash_len);
445
- return 1;
494
+ *out_len = len;
495
+ return true;
446
496
  }
447
497
 
448
- int tls13_verify_psk_binder(SSL_HANDSHAKE *hs, SSL_SESSION *session,
449
- const SSLMessage &msg, CBS *binders) {
450
- size_t hash_len = hs->transcript.DigestLen();
498
+ bool tls13_write_psk_binder(SSL_HANDSHAKE *hs, Span<uint8_t> msg) {
499
+ SSL *const ssl = hs->ssl;
500
+ const EVP_MD *digest = ssl_session_get_digest(ssl->session.get());
501
+ size_t hash_len = EVP_MD_size(digest);
451
502
 
452
- // The message must be large enough to exclude the binders.
453
- if (CBS_len(&msg.raw) < CBS_len(binders) + 2) {
503
+ ScopedEVP_MD_CTX ctx;
504
+ uint8_t context[EVP_MAX_MD_SIZE];
505
+ size_t context_len;
506
+ uint8_t verify_data[EVP_MAX_MD_SIZE];
507
+ size_t verify_data_len;
508
+ if (!hash_transcript_and_truncated_client_hello(
509
+ hs, context, &context_len, digest, msg,
510
+ 1 /* length prefix */ + hash_len) ||
511
+ !tls13_psk_binder(verify_data, &verify_data_len,
512
+ ssl->session->ssl_version, digest,
513
+ MakeConstSpan(ssl->session->master_key,
514
+ ssl->session->master_key_length),
515
+ MakeConstSpan(context, context_len)) ||
516
+ verify_data_len != hash_len) {
454
517
  OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
455
- return 0;
518
+ return false;
456
519
  }
457
520
 
458
- // Hash a ClientHello prefix up to the binders. This includes the header. For
459
- // now, this assumes we only ever verify PSK binders on initial
460
- // ClientHellos.
461
- uint8_t context[EVP_MAX_MD_SIZE];
462
- unsigned context_len;
463
- if (!EVP_Digest(CBS_data(&msg.raw), CBS_len(&msg.raw) - CBS_len(binders) - 2,
464
- context, &context_len, hs->transcript.Digest(), NULL)) {
465
- return 0;
466
- }
521
+ OPENSSL_memcpy(msg.data() + msg.size() - verify_data_len, verify_data,
522
+ verify_data_len);
523
+ return true;
524
+ }
467
525
 
468
- uint8_t verify_data[EVP_MAX_MD_SIZE] = {0};
526
+ bool tls13_verify_psk_binder(SSL_HANDSHAKE *hs, SSL_SESSION *session,
527
+ const SSLMessage &msg, CBS *binders) {
528
+ uint8_t context[EVP_MAX_MD_SIZE];
529
+ size_t context_len;
530
+ uint8_t verify_data[EVP_MAX_MD_SIZE];
531
+ size_t verify_data_len;
469
532
  CBS binder;
470
- if (!tls13_psk_binder(verify_data, hs->ssl->version, hs->transcript.Digest(),
471
- session->master_key, session->master_key_length,
472
- context, context_len, hash_len) ||
533
+ if (!hash_transcript_and_truncated_client_hello(hs, context, &context_len,
534
+ hs->transcript.Digest(),
535
+ msg.raw, CBS_len(binders)) ||
536
+ !tls13_psk_binder(
537
+ verify_data, &verify_data_len, hs->ssl->version,
538
+ hs->transcript.Digest(),
539
+ MakeConstSpan(session->master_key, session->master_key_length),
540
+ MakeConstSpan(context, context_len)) ||
473
541
  // We only consider the first PSK, so compare against the first binder.
474
542
  !CBS_get_u8_length_prefixed(binders, &binder)) {
475
543
  OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
476
- return 0;
544
+ return false;
477
545
  }
478
546
 
479
- int binder_ok =
480
- CBS_len(&binder) == hash_len &&
481
- CRYPTO_memcmp(CBS_data(&binder), verify_data, hash_len) == 0;
547
+ bool binder_ok =
548
+ CBS_len(&binder) == verify_data_len &&
549
+ CRYPTO_memcmp(CBS_data(&binder), verify_data, verify_data_len) == 0;
482
550
  #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
483
- binder_ok = 1;
551
+ binder_ok = true;
484
552
  #endif
485
553
  if (!binder_ok) {
486
554
  OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
487
- return 0;
555
+ return false;
488
556
  }
489
557
 
490
- return 1;
558
+ return true;
491
559
  }
492
560
 
493
- } // namespace bssl
561
+ BSSL_NAMESPACE_END