grpc 1.24.0 → 1.25.0

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 (505) 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/ev_poll_posix.cc +3 -1
  113. data/src/core/lib/iomgr/exec_ctx.h +4 -3
  114. data/src/core/lib/iomgr/executor.cc +4 -2
  115. data/src/core/lib/iomgr/executor.h +3 -0
  116. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -6
  117. data/src/core/lib/iomgr/executor/threadpool.cc +1 -2
  118. data/src/core/lib/iomgr/executor/threadpool.h +7 -11
  119. data/src/core/lib/iomgr/resource_quota.cc +55 -51
  120. data/src/core/lib/iomgr/resource_quota.h +13 -9
  121. data/src/core/lib/iomgr/socket_utils_common_posix.cc +13 -0
  122. data/src/core/lib/iomgr/socket_utils_posix.h +4 -0
  123. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -11
  124. data/src/core/lib/iomgr/tcp_custom.cc +9 -7
  125. data/src/core/lib/iomgr/tcp_posix.cc +20 -16
  126. data/src/core/lib/iomgr/tcp_server.h +1 -4
  127. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
  128. data/src/core/lib/iomgr/tcp_server_posix.cc +1 -1
  129. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -11
  130. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  131. data/src/core/lib/iomgr/udp_server.cc +3 -2
  132. data/src/core/lib/iomgr/udp_server.h +6 -12
  133. data/src/core/lib/json/json.h +1 -1
  134. data/src/core/lib/json/json_string.cc +2 -2
  135. data/src/core/lib/profiling/basic_timers.cc +2 -2
  136. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -2
  137. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -1
  138. data/src/core/lib/security/credentials/credentials.h +4 -20
  139. data/src/core/lib/security/credentials/fake/fake_credentials.cc +4 -4
  140. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -3
  141. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +64 -0
  142. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +4 -4
  143. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -7
  144. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -0
  145. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -4
  146. data/src/core/lib/security/security_connector/security_connector.cc +1 -0
  147. data/src/core/lib/security/security_connector/security_connector.h +19 -17
  148. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +8 -5
  149. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  150. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  151. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +14 -6
  152. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +4 -2
  153. data/src/core/lib/security/transport/client_auth_filter.cc +17 -17
  154. data/src/core/lib/security/transport/security_handshaker.cc +29 -13
  155. data/src/core/lib/security/transport/security_handshaker.h +4 -2
  156. data/src/core/lib/security/transport/server_auth_filter.cc +14 -14
  157. data/src/core/lib/slice/slice.cc +2 -10
  158. data/src/core/lib/slice/slice_hash_table.h +4 -6
  159. data/src/core/lib/slice/slice_intern.cc +42 -39
  160. data/src/core/lib/slice/slice_internal.h +3 -3
  161. data/src/core/lib/slice/slice_utils.h +21 -4
  162. data/src/core/lib/slice/slice_weak_hash_table.h +4 -6
  163. data/src/core/lib/surface/call.cc +3 -3
  164. data/src/core/lib/surface/channel.cc +7 -0
  165. data/src/core/lib/surface/completion_queue.cc +12 -11
  166. data/src/core/lib/surface/completion_queue.h +4 -2
  167. data/src/core/lib/surface/init.cc +1 -0
  168. data/src/core/lib/surface/lame_client.cc +33 -18
  169. data/src/core/lib/surface/server.cc +77 -76
  170. data/src/core/lib/surface/version.cc +1 -1
  171. data/src/core/lib/transport/byte_stream.h +3 -7
  172. data/src/core/lib/transport/connectivity_state.cc +112 -98
  173. data/src/core/lib/transport/connectivity_state.h +100 -50
  174. data/src/core/lib/transport/static_metadata.cc +276 -288
  175. data/src/core/lib/transport/static_metadata.h +73 -76
  176. data/src/core/lib/transport/status_conversion.cc +1 -1
  177. data/src/core/lib/transport/status_metadata.cc +1 -1
  178. data/src/core/lib/transport/transport.cc +2 -2
  179. data/src/core/lib/transport/transport.h +12 -4
  180. data/src/core/lib/transport/transport_op_string.cc +14 -11
  181. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +1 -1
  182. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +1 -1
  183. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +5 -5
  184. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -2
  185. data/src/core/tsi/fake_transport_security.cc +7 -5
  186. data/src/core/tsi/grpc_shadow_boringssl.h +2918 -2627
  187. data/src/core/tsi/local_transport_security.cc +8 -6
  188. data/src/core/tsi/ssl/session_cache/ssl_session.h +1 -3
  189. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -2
  190. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +7 -5
  191. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -6
  192. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -2
  193. data/src/core/tsi/ssl_transport_security.cc +12 -12
  194. data/src/core/tsi/ssl_transport_security.h +2 -2
  195. data/src/core/tsi/transport_security_grpc.cc +7 -0
  196. data/src/core/tsi/transport_security_grpc.h +6 -0
  197. data/src/ruby/ext/grpc/extconf.rb +1 -0
  198. data/src/ruby/ext/grpc/rb_call.c +1 -1
  199. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  200. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  201. data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
  202. data/src/ruby/lib/grpc/version.rb +1 -1
  203. data/src/ruby/spec/google_rpc_status_utils_spec.rb +2 -2
  204. data/third_party/boringssl/crypto/asn1/a_bool.c +18 -5
  205. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +17 -221
  206. data/third_party/boringssl/crypto/asn1/a_dup.c +0 -24
  207. data/third_party/boringssl/crypto/asn1/a_enum.c +2 -2
  208. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +10 -72
  209. data/third_party/boringssl/crypto/asn1/a_int.c +12 -71
  210. data/third_party/boringssl/crypto/asn1/a_mbstr.c +110 -216
  211. data/third_party/boringssl/crypto/asn1/a_object.c +16 -5
  212. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  213. data/third_party/boringssl/crypto/asn1/asn1_lib.c +5 -1
  214. data/third_party/boringssl/crypto/asn1/tasn_enc.c +3 -1
  215. data/third_party/boringssl/crypto/base64/base64.c +2 -2
  216. data/third_party/boringssl/crypto/bio/bio.c +73 -9
  217. data/third_party/boringssl/crypto/bio/connect.c +4 -0
  218. data/third_party/boringssl/crypto/bio/fd.c +4 -0
  219. data/third_party/boringssl/crypto/bio/file.c +5 -2
  220. data/third_party/boringssl/crypto/bio/socket.c +4 -0
  221. data/third_party/boringssl/crypto/bio/socket_helper.c +4 -0
  222. data/third_party/boringssl/crypto/bn_extra/convert.c +11 -7
  223. data/third_party/boringssl/crypto/bytestring/ber.c +8 -4
  224. data/third_party/boringssl/crypto/bytestring/cbb.c +19 -7
  225. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -15
  226. data/third_party/boringssl/crypto/bytestring/internal.h +28 -7
  227. data/third_party/boringssl/crypto/bytestring/unicode.c +155 -0
  228. data/third_party/boringssl/crypto/chacha/chacha.c +36 -19
  229. data/third_party/boringssl/crypto/chacha/internal.h +45 -0
  230. data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +29 -0
  231. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +269 -25
  232. data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +16 -14
  233. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +54 -38
  234. data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +133 -41
  235. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +23 -15
  236. data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +24 -15
  237. data/third_party/boringssl/crypto/cmac/cmac.c +62 -25
  238. data/third_party/boringssl/crypto/conf/conf.c +7 -0
  239. data/third_party/boringssl/crypto/cpu-arm-linux.c +4 -148
  240. data/third_party/boringssl/crypto/cpu-arm-linux.h +201 -0
  241. data/third_party/boringssl/crypto/cpu-intel.c +45 -51
  242. data/third_party/boringssl/crypto/crypto.c +39 -22
  243. data/third_party/boringssl/crypto/curve25519/spake25519.c +1 -1
  244. data/third_party/boringssl/crypto/dsa/dsa.c +77 -53
  245. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +20 -8
  246. data/third_party/boringssl/crypto/ec_extra/ec_derive.c +96 -0
  247. data/third_party/boringssl/crypto/{ecdh/ecdh.c → ecdh_extra/ecdh_extra.c} +20 -58
  248. data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +1 -9
  249. data/third_party/boringssl/crypto/engine/engine.c +2 -1
  250. data/third_party/boringssl/crypto/err/err.c +2 -0
  251. data/third_party/boringssl/crypto/err/internal.h +2 -2
  252. data/third_party/boringssl/crypto/evp/evp.c +89 -8
  253. data/third_party/boringssl/crypto/evp/evp_asn1.c +56 -5
  254. data/third_party/boringssl/crypto/evp/evp_ctx.c +52 -14
  255. data/third_party/boringssl/crypto/evp/internal.h +18 -1
  256. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +5 -0
  257. data/third_party/boringssl/crypto/evp/p_ec.c +51 -3
  258. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +6 -7
  259. data/third_party/boringssl/crypto/evp/p_ed25519.c +36 -3
  260. data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +76 -45
  261. data/third_party/boringssl/crypto/evp/p_rsa.c +3 -1
  262. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +5 -0
  263. data/third_party/boringssl/crypto/evp/p_x25519.c +110 -0
  264. data/third_party/boringssl/crypto/evp/p_x25519_asn1.c +249 -0
  265. data/third_party/boringssl/crypto/evp/scrypt.c +6 -2
  266. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +34 -274
  267. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +161 -21
  268. data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +111 -13
  269. data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +17 -21
  270. data/third_party/boringssl/crypto/fipsmodule/bcm.c +119 -7
  271. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +19 -2
  272. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +2 -2
  273. data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +93 -160
  274. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +48 -57
  275. data/third_party/boringssl/crypto/fipsmodule/bn/div_extra.c +87 -0
  276. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +143 -211
  277. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +0 -305
  278. data/third_party/boringssl/crypto/fipsmodule/bn/gcd_extra.c +325 -0
  279. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +168 -50
  280. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +68 -92
  281. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +7 -6
  282. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +11 -14
  283. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +358 -443
  284. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +25 -35
  285. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +20 -25
  286. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +76 -5
  287. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +14 -14
  288. data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +7 -2
  289. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +383 -516
  290. data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +4 -0
  291. data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +3 -4
  292. data/third_party/boringssl/crypto/fipsmodule/delocate.h +3 -2
  293. data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +32 -17
  294. data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +3 -3
  295. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +228 -122
  296. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +34 -8
  297. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +311 -98
  298. data/third_party/boringssl/crypto/fipsmodule/ec/felem.c +82 -0
  299. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +263 -97
  300. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +22 -59
  301. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +317 -234
  302. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +9473 -9475
  303. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +313 -109
  304. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +36 -0
  305. data/third_party/boringssl/crypto/fipsmodule/ec/scalar.c +96 -0
  306. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +126 -792
  307. data/third_party/boringssl/crypto/fipsmodule/ec/simple_mul.c +84 -0
  308. data/third_party/boringssl/crypto/fipsmodule/ec/util.c +163 -12
  309. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +84 -211
  310. data/third_party/boringssl/crypto/fipsmodule/ecdh/ecdh.c +122 -0
  311. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +60 -205
  312. data/third_party/boringssl/crypto/fipsmodule/fips_shared_support.c +32 -0
  313. data/third_party/boringssl/crypto/fipsmodule/is_fips.c +2 -0
  314. data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +3 -1
  315. data/third_party/boringssl/crypto/fipsmodule/md5/internal.h +37 -0
  316. data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +11 -8
  317. data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +35 -79
  318. data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +7 -39
  319. data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +7 -27
  320. data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +123 -309
  321. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +189 -126
  322. data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +3 -2
  323. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +2 -2
  324. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +35 -0
  325. data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +24 -19
  326. data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +256 -77
  327. data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +10 -7
  328. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +5 -1
  329. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +131 -14
  330. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +83 -10
  331. data/third_party/boringssl/crypto/fipsmodule/sha/internal.h +53 -0
  332. data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +9 -13
  333. data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +18 -12
  334. data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +95 -168
  335. data/third_party/boringssl/crypto/hrss/hrss.c +2201 -0
  336. data/third_party/boringssl/crypto/hrss/internal.h +62 -0
  337. data/third_party/boringssl/crypto/internal.h +95 -20
  338. data/third_party/boringssl/crypto/lhash/lhash.c +45 -33
  339. data/third_party/boringssl/crypto/mem.c +39 -2
  340. data/third_party/boringssl/crypto/obj/obj.c +4 -4
  341. data/third_party/boringssl/crypto/obj/obj_dat.h +6181 -875
  342. data/third_party/boringssl/crypto/pem/pem_all.c +2 -3
  343. data/third_party/boringssl/crypto/pem/pem_info.c +144 -162
  344. data/third_party/boringssl/crypto/pem/pem_lib.c +53 -52
  345. data/third_party/boringssl/crypto/pem/pem_pkey.c +13 -21
  346. data/third_party/boringssl/crypto/pkcs7/pkcs7.c +15 -22
  347. data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +168 -16
  348. data/third_party/boringssl/crypto/pkcs8/internal.h +11 -0
  349. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +24 -15
  350. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +42 -25
  351. data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +559 -43
  352. data/third_party/boringssl/crypto/pool/internal.h +1 -1
  353. data/third_party/boringssl/crypto/pool/pool.c +21 -0
  354. data/third_party/boringssl/crypto/rand_extra/deterministic.c +8 -0
  355. data/third_party/boringssl/crypto/rand_extra/fuchsia.c +1 -14
  356. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  357. data/third_party/boringssl/crypto/rsa_extra/rsa_print.c +22 -0
  358. data/third_party/boringssl/crypto/siphash/siphash.c +80 -0
  359. data/third_party/boringssl/crypto/stack/stack.c +83 -32
  360. data/third_party/boringssl/crypto/thread_none.c +2 -2
  361. data/third_party/boringssl/crypto/thread_pthread.c +2 -2
  362. data/third_party/boringssl/crypto/thread_win.c +38 -19
  363. data/third_party/boringssl/crypto/x509/a_strex.c +22 -2
  364. data/third_party/boringssl/crypto/x509/asn1_gen.c +2 -1
  365. data/third_party/boringssl/crypto/x509/by_dir.c +7 -0
  366. data/third_party/boringssl/crypto/x509/by_file.c +12 -10
  367. data/third_party/boringssl/crypto/x509/t_crl.c +5 -8
  368. data/third_party/boringssl/crypto/x509/t_req.c +1 -3
  369. data/third_party/boringssl/crypto/x509/t_x509.c +5 -8
  370. data/third_party/boringssl/crypto/x509/x509_cmp.c +1 -1
  371. data/third_party/boringssl/crypto/x509/x509_def.c +1 -1
  372. data/third_party/boringssl/crypto/x509/x509_lu.c +114 -5
  373. data/third_party/boringssl/crypto/x509/x509_req.c +20 -0
  374. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  375. data/third_party/boringssl/crypto/x509/x509_trs.c +1 -0
  376. data/third_party/boringssl/crypto/x509/x509_txt.c +4 -5
  377. data/third_party/boringssl/crypto/x509/x509_vfy.c +145 -138
  378. data/third_party/boringssl/crypto/x509/x509_vpm.c +2 -0
  379. data/third_party/boringssl/crypto/x509/x509cset.c +40 -0
  380. data/third_party/boringssl/crypto/x509/x509name.c +2 -3
  381. data/third_party/boringssl/crypto/x509/x_all.c +109 -210
  382. data/third_party/boringssl/crypto/x509/x_x509.c +6 -0
  383. data/third_party/boringssl/crypto/x509v3/ext_dat.h +1 -3
  384. data/third_party/boringssl/crypto/x509v3/internal.h +56 -0
  385. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -0
  386. data/third_party/boringssl/crypto/x509v3/pcy_node.c +1 -0
  387. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +4 -2
  388. data/third_party/boringssl/crypto/x509v3/v3_akey.c +5 -2
  389. data/third_party/boringssl/crypto/x509v3/v3_alt.c +19 -13
  390. data/third_party/boringssl/crypto/x509v3/v3_conf.c +2 -1
  391. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +3 -2
  392. data/third_party/boringssl/crypto/x509v3/v3_genn.c +1 -6
  393. data/third_party/boringssl/crypto/x509v3/v3_lib.c +1 -0
  394. data/third_party/boringssl/crypto/x509v3/v3_ocsp.c +68 -0
  395. data/third_party/boringssl/crypto/x509v3/v3_pci.c +2 -1
  396. data/third_party/boringssl/crypto/x509v3/v3_purp.c +47 -69
  397. data/third_party/boringssl/crypto/x509v3/v3_skey.c +5 -2
  398. data/third_party/boringssl/crypto/x509v3/v3_utl.c +69 -25
  399. data/third_party/boringssl/include/openssl/aead.h +45 -19
  400. data/third_party/boringssl/include/openssl/aes.h +32 -7
  401. data/third_party/boringssl/include/openssl/asn1.h +7 -77
  402. data/third_party/boringssl/include/openssl/base.h +120 -6
  403. data/third_party/boringssl/include/openssl/base64.h +4 -1
  404. data/third_party/boringssl/include/openssl/bio.h +112 -81
  405. data/third_party/boringssl/include/openssl/blowfish.h +3 -3
  406. data/third_party/boringssl/include/openssl/bn.h +55 -29
  407. data/third_party/boringssl/include/openssl/buf.h +2 -2
  408. data/third_party/boringssl/include/openssl/bytestring.h +54 -32
  409. data/third_party/boringssl/include/openssl/cast.h +2 -2
  410. data/third_party/boringssl/include/openssl/cipher.h +46 -16
  411. data/third_party/boringssl/include/openssl/cmac.h +6 -2
  412. data/third_party/boringssl/include/openssl/conf.h +3 -6
  413. data/third_party/boringssl/include/openssl/cpu.h +25 -9
  414. data/third_party/boringssl/include/openssl/crypto.h +32 -10
  415. data/third_party/boringssl/include/openssl/curve25519.h +4 -4
  416. data/third_party/boringssl/include/openssl/dh.h +3 -2
  417. data/third_party/boringssl/include/openssl/digest.h +21 -7
  418. data/third_party/boringssl/include/openssl/dsa.h +8 -2
  419. data/third_party/boringssl/include/openssl/e_os2.h +18 -0
  420. data/third_party/boringssl/include/openssl/ec.h +25 -21
  421. data/third_party/boringssl/include/openssl/ec_key.h +36 -8
  422. data/third_party/boringssl/include/openssl/ecdh.h +17 -0
  423. data/third_party/boringssl/include/openssl/ecdsa.h +3 -3
  424. data/third_party/boringssl/include/openssl/engine.h +4 -4
  425. data/third_party/boringssl/include/openssl/err.h +3 -0
  426. data/third_party/boringssl/include/openssl/evp.h +199 -42
  427. data/third_party/boringssl/include/openssl/hmac.h +4 -4
  428. data/third_party/boringssl/include/openssl/hrss.h +100 -0
  429. data/third_party/boringssl/include/openssl/lhash.h +131 -23
  430. data/third_party/boringssl/include/openssl/md4.h +6 -4
  431. data/third_party/boringssl/include/openssl/md5.h +6 -4
  432. data/third_party/boringssl/include/openssl/mem.h +6 -2
  433. data/third_party/boringssl/include/openssl/nid.h +3 -0
  434. data/third_party/boringssl/include/openssl/obj.h +3 -0
  435. data/third_party/boringssl/include/openssl/pem.h +102 -64
  436. data/third_party/boringssl/include/openssl/pkcs7.h +136 -3
  437. data/third_party/boringssl/include/openssl/pkcs8.h +42 -3
  438. data/third_party/boringssl/include/openssl/pool.h +13 -2
  439. data/third_party/boringssl/include/openssl/ripemd.h +5 -4
  440. data/third_party/boringssl/include/openssl/rsa.h +46 -15
  441. data/third_party/boringssl/include/openssl/sha.h +40 -28
  442. data/third_party/boringssl/include/openssl/siphash.h +37 -0
  443. data/third_party/boringssl/include/openssl/span.h +17 -9
  444. data/third_party/boringssl/include/openssl/ssl.h +766 -393
  445. data/third_party/boringssl/include/openssl/ssl3.h +4 -3
  446. data/third_party/boringssl/include/openssl/stack.h +134 -77
  447. data/third_party/boringssl/include/openssl/thread.h +1 -1
  448. data/third_party/boringssl/include/openssl/tls1.h +25 -9
  449. data/third_party/boringssl/include/openssl/type_check.h +14 -15
  450. data/third_party/boringssl/include/openssl/x509.h +28 -3
  451. data/third_party/boringssl/include/openssl/x509_vfy.h +98 -32
  452. data/third_party/boringssl/include/openssl/x509v3.h +17 -13
  453. data/third_party/boringssl/ssl/d1_both.cc +9 -18
  454. data/third_party/boringssl/ssl/d1_lib.cc +4 -3
  455. data/third_party/boringssl/ssl/d1_pkt.cc +4 -4
  456. data/third_party/boringssl/ssl/d1_srtp.cc +15 -15
  457. data/third_party/boringssl/ssl/dtls_method.cc +0 -1
  458. data/third_party/boringssl/ssl/dtls_record.cc +28 -28
  459. data/third_party/boringssl/ssl/handoff.cc +295 -91
  460. data/third_party/boringssl/ssl/handshake.cc +133 -72
  461. data/third_party/boringssl/ssl/handshake_client.cc +218 -189
  462. data/third_party/boringssl/ssl/handshake_server.cc +399 -272
  463. data/third_party/boringssl/ssl/internal.h +1413 -928
  464. data/third_party/boringssl/ssl/s3_both.cc +175 -36
  465. data/third_party/boringssl/ssl/s3_lib.cc +9 -13
  466. data/third_party/boringssl/ssl/s3_pkt.cc +63 -29
  467. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +55 -35
  468. data/third_party/boringssl/ssl/ssl_asn1.cc +57 -73
  469. data/third_party/boringssl/ssl/ssl_buffer.cc +13 -12
  470. data/third_party/boringssl/ssl/ssl_cert.cc +313 -210
  471. data/third_party/boringssl/ssl/ssl_cipher.cc +159 -221
  472. data/third_party/boringssl/ssl/ssl_file.cc +2 -0
  473. data/third_party/boringssl/ssl/ssl_key_share.cc +164 -19
  474. data/third_party/boringssl/ssl/ssl_lib.cc +847 -555
  475. data/third_party/boringssl/ssl/ssl_privkey.cc +441 -111
  476. data/third_party/boringssl/ssl/ssl_session.cc +230 -178
  477. data/third_party/boringssl/ssl/ssl_transcript.cc +21 -142
  478. data/third_party/boringssl/ssl/ssl_versions.cc +88 -93
  479. data/third_party/boringssl/ssl/ssl_x509.cc +279 -218
  480. data/third_party/boringssl/ssl/t1_enc.cc +5 -96
  481. data/third_party/boringssl/ssl/t1_lib.cc +931 -678
  482. data/third_party/boringssl/ssl/tls13_both.cc +251 -121
  483. data/third_party/boringssl/ssl/tls13_client.cc +129 -73
  484. data/third_party/boringssl/ssl/tls13_enc.cc +350 -282
  485. data/third_party/boringssl/ssl/tls13_server.cc +259 -192
  486. data/third_party/boringssl/ssl/tls_method.cc +26 -21
  487. data/third_party/boringssl/ssl/tls_record.cc +42 -47
  488. data/third_party/boringssl/third_party/fiat/curve25519.c +261 -1324
  489. data/third_party/boringssl/third_party/fiat/curve25519_32.h +911 -0
  490. data/third_party/boringssl/third_party/fiat/curve25519_64.h +559 -0
  491. data/third_party/boringssl/third_party/fiat/p256.c +238 -999
  492. data/third_party/boringssl/third_party/fiat/p256_32.h +3226 -0
  493. data/third_party/boringssl/third_party/fiat/p256_64.h +1217 -0
  494. data/third_party/upb/upb/port_def.inc +1 -1
  495. data/third_party/upb/upb/table.c +2 -1
  496. metadata +72 -44
  497. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +0 -127
  498. data/src/core/lib/gpr/mpscq.cc +0 -117
  499. data/src/core/lib/gpr/mpscq.h +0 -88
  500. data/src/core/lib/gprpp/abstract.h +0 -47
  501. data/src/core/lib/gprpp/pair.h +0 -38
  502. data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +0 -460
  503. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +0 -256
  504. data/third_party/boringssl/include/openssl/lhash_macros.h +0 -174
  505. data/third_party/boringssl/ssl/custom_extensions.cc +0 -265
@@ -65,8 +65,8 @@
65
65
 
66
66
  static int bn_cmp_words_consttime(const BN_ULONG *a, size_t a_len,
67
67
  const BN_ULONG *b, size_t b_len) {
68
- OPENSSL_COMPILE_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
69
- crypto_word_t_too_small);
68
+ OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
69
+ "crypto_word_t is too small");
70
70
  int ret = 0;
71
71
  // Process the common words in little-endian order.
72
72
  size_t min = a_len < b_len ? a_len : b_len;
@@ -54,6 +54,7 @@
54
54
 
55
55
  #include <openssl/bn.h>
56
56
 
57
+ #include <assert.h>
57
58
  #include <string.h>
58
59
 
59
60
  #include <openssl/err.h>
@@ -62,63 +63,46 @@
62
63
  #include "../../internal.h"
63
64
 
64
65
 
65
- // How many bignums are in each "pool item";
66
- #define BN_CTX_POOL_SIZE 16
67
66
  // The stack frame info is resizing, set a first-time expansion size;
68
67
  #define BN_CTX_START_FRAMES 32
69
68
 
70
- // A bundle of bignums that can be linked with other bundles
71
- typedef struct bignum_pool_item {
72
- // The bignum values
73
- BIGNUM vals[BN_CTX_POOL_SIZE];
74
- // Linked-list admin
75
- struct bignum_pool_item *prev, *next;
76
- } BN_POOL_ITEM;
77
-
78
-
79
- typedef struct bignum_pool {
80
- // Linked-list admin
81
- BN_POOL_ITEM *head, *current, *tail;
82
- // Stack depth and allocation size
83
- unsigned used, size;
84
- } BN_POOL;
85
-
86
- static void BN_POOL_init(BN_POOL *);
87
- static void BN_POOL_finish(BN_POOL *);
88
- static BIGNUM *BN_POOL_get(BN_POOL *);
89
- static void BN_POOL_release(BN_POOL *, unsigned int);
90
-
91
69
 
92
70
  // BN_STACK
93
71
 
94
- // A wrapper to manage the "stack frames"
95
- typedef struct bignum_ctx_stack {
96
- // Array of indexes into the bignum stack
97
- unsigned int *indexes;
72
+ // A |BN_STACK| is a stack of |size_t| values.
73
+ typedef struct {
74
+ // Array of indexes into |ctx->bignums|.
75
+ size_t *indexes;
98
76
  // Number of stack frames, and the size of the allocated array
99
- unsigned int depth, size;
77
+ size_t depth, size;
100
78
  } BN_STACK;
101
79
 
102
- static void BN_STACK_init(BN_STACK *);
103
- static void BN_STACK_finish(BN_STACK *);
104
- static int BN_STACK_push(BN_STACK *, unsigned int);
105
- static unsigned int BN_STACK_pop(BN_STACK *);
80
+ static void BN_STACK_init(BN_STACK *);
81
+ static void BN_STACK_cleanup(BN_STACK *);
82
+ static int BN_STACK_push(BN_STACK *, size_t idx);
83
+ static size_t BN_STACK_pop(BN_STACK *);
106
84
 
107
85
 
108
86
  // BN_CTX
109
87
 
88
+ DEFINE_STACK_OF(BIGNUM)
89
+
110
90
  // The opaque BN_CTX type
111
91
  struct bignum_ctx {
112
- // The bignum bundles
113
- BN_POOL pool;
114
- // The "stack frames", if you will
92
+ // bignums is the stack of |BIGNUM|s managed by this |BN_CTX|.
93
+ STACK_OF(BIGNUM) *bignums;
94
+ // stack is the stack of |BN_CTX_start| frames. It is the value of |used| at
95
+ // the time |BN_CTX_start| was called.
115
96
  BN_STACK stack;
116
- // The number of bignums currently assigned
117
- unsigned int used;
118
- // Depth of stack overflow
119
- int err_stack;
120
- // Block "gets" until an "end" (compatibility behaviour)
121
- int too_many;
97
+ // used is the number of |BIGNUM|s from |bignums| that have been used.
98
+ size_t used;
99
+ // error is one if any operation on this |BN_CTX| failed. All subsequent
100
+ // operations will fail.
101
+ char error;
102
+ // defer_error is one if an operation on this |BN_CTX| has failed, but no
103
+ // error has been pushed to the queue yet. This is used to defer errors from
104
+ // |BN_CTX_start| to |BN_CTX_get|.
105
+ char defer_error;
122
106
  };
123
107
 
124
108
  BN_CTX *BN_CTX_new(void) {
@@ -129,11 +113,11 @@ BN_CTX *BN_CTX_new(void) {
129
113
  }
130
114
 
131
115
  // Initialise the structure
132
- BN_POOL_init(&ret->pool);
116
+ ret->bignums = NULL;
133
117
  BN_STACK_init(&ret->stack);
134
118
  ret->used = 0;
135
- ret->err_stack = 0;
136
- ret->too_many = 0;
119
+ ret->error = 0;
120
+ ret->defer_error = 0;
137
121
  return ret;
138
122
  }
139
123
 
@@ -142,57 +126,73 @@ void BN_CTX_free(BN_CTX *ctx) {
142
126
  return;
143
127
  }
144
128
 
145
- BN_STACK_finish(&ctx->stack);
146
- BN_POOL_finish(&ctx->pool);
129
+ // All |BN_CTX_start| calls must be matched with |BN_CTX_end|, otherwise the
130
+ // function may use more memory than expected, potentially without bound if
131
+ // done in a loop. Assert that all |BIGNUM|s have been released.
132
+ assert(ctx->used == 0 || ctx->error);
133
+ sk_BIGNUM_pop_free(ctx->bignums, BN_free);
134
+ BN_STACK_cleanup(&ctx->stack);
147
135
  OPENSSL_free(ctx);
148
136
  }
149
137
 
150
138
  void BN_CTX_start(BN_CTX *ctx) {
151
- // If we're already overflowing ...
152
- if (ctx->err_stack || ctx->too_many) {
153
- ctx->err_stack++;
154
- } else if (!BN_STACK_push(&ctx->stack, ctx->used)) {
155
- // (Try to) get a new frame pointer
156
- OPENSSL_PUT_ERROR(BN, BN_R_TOO_MANY_TEMPORARY_VARIABLES);
157
- ctx->err_stack++;
139
+ if (ctx->error) {
140
+ // Once an operation has failed, |ctx->stack| no longer matches the number
141
+ // of |BN_CTX_end| calls to come. Do nothing.
142
+ return;
143
+ }
144
+
145
+ if (!BN_STACK_push(&ctx->stack, ctx->used)) {
146
+ ctx->error = 1;
147
+ // |BN_CTX_start| cannot fail, so defer the error to |BN_CTX_get|.
148
+ ctx->defer_error = 1;
158
149
  }
159
150
  }
160
151
 
161
152
  BIGNUM *BN_CTX_get(BN_CTX *ctx) {
162
- BIGNUM *ret;
163
- if (ctx->err_stack || ctx->too_many) {
153
+ // Once any operation has failed, they all do.
154
+ if (ctx->error) {
155
+ if (ctx->defer_error) {
156
+ OPENSSL_PUT_ERROR(BN, BN_R_TOO_MANY_TEMPORARY_VARIABLES);
157
+ ctx->defer_error = 0;
158
+ }
164
159
  return NULL;
165
160
  }
166
161
 
167
- ret = BN_POOL_get(&ctx->pool);
168
- if (ret == NULL) {
169
- // Setting too_many prevents repeated "get" attempts from
170
- // cluttering the error stack.
171
- ctx->too_many = 1;
172
- OPENSSL_PUT_ERROR(BN, BN_R_TOO_MANY_TEMPORARY_VARIABLES);
173
- return NULL;
162
+ if (ctx->bignums == NULL) {
163
+ ctx->bignums = sk_BIGNUM_new_null();
164
+ if (ctx->bignums == NULL) {
165
+ OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE);
166
+ ctx->error = 1;
167
+ return NULL;
168
+ }
174
169
  }
175
170
 
176
- // OK, make sure the returned bignum is "zero"
171
+ if (ctx->used == sk_BIGNUM_num(ctx->bignums)) {
172
+ BIGNUM *bn = BN_new();
173
+ if (bn == NULL || !sk_BIGNUM_push(ctx->bignums, bn)) {
174
+ OPENSSL_PUT_ERROR(BN, BN_R_TOO_MANY_TEMPORARY_VARIABLES);
175
+ BN_free(bn);
176
+ ctx->error = 1;
177
+ return NULL;
178
+ }
179
+ }
180
+
181
+ BIGNUM *ret = sk_BIGNUM_value(ctx->bignums, ctx->used);
177
182
  BN_zero(ret);
183
+ // This is bounded by |sk_BIGNUM_num|, so it cannot overflow.
178
184
  ctx->used++;
179
185
  return ret;
180
186
  }
181
187
 
182
188
  void BN_CTX_end(BN_CTX *ctx) {
183
- if (ctx->err_stack) {
184
- ctx->err_stack--;
185
- } else {
186
- unsigned int fp = BN_STACK_pop(&ctx->stack);
187
- // Does this stack frame have anything to release?
188
- if (fp < ctx->used) {
189
- BN_POOL_release(&ctx->pool, ctx->used - fp);
190
- }
191
-
192
- ctx->used = fp;
193
- // Unjam "too_many" in case "get" had failed
194
- ctx->too_many = 0;
189
+ if (ctx->error) {
190
+ // Once an operation has failed, |ctx->stack| no longer matches the number
191
+ // of |BN_CTX_end| calls to come. Do nothing.
192
+ return;
195
193
  }
194
+
195
+ ctx->used = BN_STACK_pop(&ctx->stack);
196
196
  }
197
197
 
198
198
 
@@ -203,101 +203,34 @@ static void BN_STACK_init(BN_STACK *st) {
203
203
  st->depth = st->size = 0;
204
204
  }
205
205
 
206
- static void BN_STACK_finish(BN_STACK *st) {
206
+ static void BN_STACK_cleanup(BN_STACK *st) {
207
207
  OPENSSL_free(st->indexes);
208
208
  }
209
209
 
210
- static int BN_STACK_push(BN_STACK *st, unsigned int idx) {
210
+ static int BN_STACK_push(BN_STACK *st, size_t idx) {
211
211
  if (st->depth == st->size) {
212
- // Need to expand
213
- unsigned int newsize =
214
- (st->size ? (st->size * 3 / 2) : BN_CTX_START_FRAMES);
215
- unsigned int *newitems = OPENSSL_malloc(newsize * sizeof(unsigned int));
216
- if (!newitems) {
212
+ // This function intentionally does not push to the error queue on error.
213
+ // Error-reporting is deferred to |BN_CTX_get|.
214
+ size_t new_size = st->size != 0 ? st->size * 3 / 2 : BN_CTX_START_FRAMES;
215
+ if (new_size <= st->size || new_size > ((size_t)-1) / sizeof(size_t)) {
217
216
  return 0;
218
217
  }
219
- if (st->depth) {
220
- OPENSSL_memcpy(newitems, st->indexes, st->depth * sizeof(unsigned int));
218
+ size_t *new_indexes =
219
+ OPENSSL_realloc(st->indexes, new_size * sizeof(size_t));
220
+ if (new_indexes == NULL) {
221
+ return 0;
221
222
  }
222
- OPENSSL_free(st->indexes);
223
- st->indexes = newitems;
224
- st->size = newsize;
223
+ st->indexes = new_indexes;
224
+ st->size = new_size;
225
225
  }
226
226
 
227
- st->indexes[(st->depth)++] = idx;
227
+ st->indexes[st->depth] = idx;
228
+ st->depth++;
228
229
  return 1;
229
230
  }
230
231
 
231
- static unsigned int BN_STACK_pop(BN_STACK *st) {
232
- return st->indexes[--(st->depth)];
233
- }
234
-
235
-
236
- static void BN_POOL_init(BN_POOL *p) {
237
- p->head = p->current = p->tail = NULL;
238
- p->used = p->size = 0;
239
- }
240
-
241
- static void BN_POOL_finish(BN_POOL *p) {
242
- while (p->head) {
243
- for (size_t i = 0; i < BN_CTX_POOL_SIZE; i++) {
244
- BN_clear_free(&p->head->vals[i]);
245
- }
246
-
247
- p->current = p->head->next;
248
- OPENSSL_free(p->head);
249
- p->head = p->current;
250
- }
251
- }
252
-
253
- static BIGNUM *BN_POOL_get(BN_POOL *p) {
254
- if (p->used == p->size) {
255
- BN_POOL_ITEM *item = OPENSSL_malloc(sizeof(BN_POOL_ITEM));
256
- if (!item) {
257
- return NULL;
258
- }
259
-
260
- // Initialise the structure
261
- for (size_t i = 0; i < BN_CTX_POOL_SIZE; i++) {
262
- BN_init(&item->vals[i]);
263
- }
264
-
265
- item->prev = p->tail;
266
- item->next = NULL;
267
- // Link it in
268
- if (!p->head) {
269
- p->head = p->current = p->tail = item;
270
- } else {
271
- p->tail->next = item;
272
- p->tail = item;
273
- p->current = item;
274
- }
275
-
276
- p->size += BN_CTX_POOL_SIZE;
277
- p->used++;
278
- // Return the first bignum from the new pool
279
- return item->vals;
280
- }
281
-
282
- if (!p->used) {
283
- p->current = p->head;
284
- } else if ((p->used % BN_CTX_POOL_SIZE) == 0) {
285
- p->current = p->current->next;
286
- }
287
-
288
- return p->current->vals + ((p->used++) % BN_CTX_POOL_SIZE);
289
- }
290
-
291
- static void BN_POOL_release(BN_POOL *p, unsigned int num) {
292
- unsigned int offset = (p->used - 1) % BN_CTX_POOL_SIZE;
293
- p->used -= num;
294
-
295
- while (num--) {
296
- if (!offset) {
297
- offset = BN_CTX_POOL_SIZE - 1;
298
- p->current = p->current->prev;
299
- } else {
300
- offset--;
301
- }
302
- }
232
+ static size_t BN_STACK_pop(BN_STACK *st) {
233
+ assert(st->depth > 0);
234
+ st->depth--;
235
+ return st->indexes[st->depth];
303
236
  }
@@ -64,7 +64,7 @@
64
64
  #include "internal.h"
65
65
 
66
66
 
67
- #if !defined(BN_ULLONG)
67
+ #if !defined(BN_CAN_DIVIDE_ULLONG) && !defined(BN_CAN_USE_INLINE_ASM)
68
68
  // bn_div_words divides a double-width |h|,|l| by |d| and returns the result,
69
69
  // which must fit in a |BN_ULONG|.
70
70
  static BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d) {
@@ -135,7 +135,7 @@ static BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d) {
135
135
  ret |= q;
136
136
  return ret;
137
137
  }
138
- #endif // !defined(BN_ULLONG)
138
+ #endif // !defined(BN_CAN_DIVIDE_ULLONG) && !defined(BN_CAN_USE_INLINE_ASM)
139
139
 
140
140
  static inline void bn_div_rem_words(BN_ULONG *quotient_out, BN_ULONG *rem_out,
141
141
  BN_ULONG n0, BN_ULONG n1, BN_ULONG d0) {
@@ -155,20 +155,18 @@ static inline void bn_div_rem_words(BN_ULONG *quotient_out, BN_ULONG *rem_out,
155
155
  //
156
156
  // These issues aren't specific to x86 and x86_64, so it might be worthwhile
157
157
  // to add more assembly language implementations.
158
- #if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86) && \
159
- (defined(__GNUC__) || defined(__clang__))
158
+ #if defined(BN_CAN_USE_INLINE_ASM) && defined(OPENSSL_X86)
160
159
  __asm__ volatile("divl %4"
161
160
  : "=a"(*quotient_out), "=d"(*rem_out)
162
161
  : "a"(n1), "d"(n0), "rm"(d0)
163
162
  : "cc");
164
- #elif !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && \
165
- (defined(__GNUC__) || defined(__clang__))
163
+ #elif defined(BN_CAN_USE_INLINE_ASM) && defined(OPENSSL_X86_64)
166
164
  __asm__ volatile("divq %4"
167
165
  : "=a"(*quotient_out), "=d"(*rem_out)
168
166
  : "a"(n1), "d"(n0), "rm"(d0)
169
167
  : "cc");
170
168
  #else
171
- #if defined(BN_ULLONG)
169
+ #if defined(BN_CAN_DIVIDE_ULLONG)
172
170
  BN_ULLONG n = (((BN_ULLONG)n0) << BN_BITS2) | n1;
173
171
  *quotient_out = (BN_ULONG)(n / d0);
174
172
  #else
@@ -414,11 +412,37 @@ int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx) {
414
412
  return (d->neg ? BN_sub : BN_add)(r, r, d);
415
413
  }
416
414
 
417
- // bn_mod_sub_words sets |r| to |a| - |b| (mod |m|), using |tmp| as scratch
418
- // space. Each array is |num| words long. |a| and |b| must be < |m|. Any pair of
419
- // |r|, |a|, and |b| may alias.
420
- static void bn_mod_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
421
- const BN_ULONG *m, BN_ULONG *tmp, size_t num) {
415
+ BN_ULONG bn_reduce_once(BN_ULONG *r, const BN_ULONG *a, BN_ULONG carry,
416
+ const BN_ULONG *m, size_t num) {
417
+ assert(r != a);
418
+ // |r| = |a| - |m|. |bn_sub_words| performs the bulk of the subtraction, and
419
+ // then we apply the borrow to |carry|.
420
+ carry -= bn_sub_words(r, a, m, num);
421
+ // We know 0 <= |a| < 2*|m|, so -|m| <= |r| < |m|.
422
+ //
423
+ // If 0 <= |r| < |m|, |r| fits in |num| words and |carry| is zero. We then
424
+ // wish to select |r| as the answer. Otherwise -m <= r < 0 and we wish to
425
+ // return |r| + |m|, or |a|. |carry| must then be -1 or all ones. In both
426
+ // cases, |carry| is a suitable input to |bn_select_words|.
427
+ //
428
+ // Although |carry| may be one if it was one on input and |bn_sub_words|
429
+ // returns zero, this would give |r| > |m|, violating our input assumptions.
430
+ assert(carry == 0 || carry == (BN_ULONG)-1);
431
+ bn_select_words(r, carry, a /* r < 0 */, r /* r >= 0 */, num);
432
+ return carry;
433
+ }
434
+
435
+ BN_ULONG bn_reduce_once_in_place(BN_ULONG *r, BN_ULONG carry, const BN_ULONG *m,
436
+ BN_ULONG *tmp, size_t num) {
437
+ // See |bn_reduce_once| for why this logic works.
438
+ carry -= bn_sub_words(tmp, r, m, num);
439
+ assert(carry == 0 || carry == (BN_ULONG)-1);
440
+ bn_select_words(r, carry, r /* tmp < 0 */, tmp /* tmp >= 0 */, num);
441
+ return carry;
442
+ }
443
+
444
+ void bn_mod_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
445
+ const BN_ULONG *m, BN_ULONG *tmp, size_t num) {
422
446
  // r = a - b
423
447
  BN_ULONG borrow = bn_sub_words(r, a, b, num);
424
448
  // tmp = a - b + m
@@ -426,32 +450,10 @@ static void bn_mod_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
426
450
  bn_select_words(r, 0 - borrow, tmp /* r < 0 */, r /* r >= 0 */, num);
427
451
  }
428
452
 
429
- // bn_mod_add_words sets |r| to |a| + |b| (mod |m|), using |tmp| as scratch
430
- // space. Each array is |num| words long. |a| and |b| must be < |m|. Any pair of
431
- // |r|, |a|, and |b| may alias.
432
- static void bn_mod_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
433
- const BN_ULONG *m, BN_ULONG *tmp, size_t num) {
434
- // tmp = a + b. Note the result fits in |num|+1 words. We store the extra word
435
- // in |carry|.
436
- BN_ULONG carry = bn_add_words(tmp, a, b, num);
437
- // r = a + b - m. We use |bn_sub_words| to perform the bulk of the
438
- // subtraction, and then apply the borrow to |carry|.
439
- carry -= bn_sub_words(r, tmp, m, num);
440
- // |a| and |b| were both fully-reduced, so we know:
441
- //
442
- // 0 + 0 - m <= r < m + m - m
443
- // -m <= r < m
444
- //
445
- // If 0 <= |r| < |m|, |r| fits in |num| words and |carry| is zero. We then
446
- // wish to select |r| as the answer. Otherwise -m <= r < 0 and we wish to
447
- // return |r| + |m|, or |tmp|. |carry| must then be -1 or all ones. In both
448
- // cases, |carry| is a suitable input to |bn_select_words|.
449
- //
450
- // Although |carry| may be one if |bn_add_words| returns one and
451
- // |bn_sub_words| returns zero, this would give |r| > |m|, which violates are
452
- // input assumptions.
453
- assert(carry == 0 || carry == (BN_ULONG)-1);
454
- bn_select_words(r, carry, tmp /* r < 0 */, r /* r >= 0 */, num);
453
+ void bn_mod_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
454
+ const BN_ULONG *m, BN_ULONG *tmp, size_t num) {
455
+ BN_ULONG carry = bn_add_words(r, a, b, num);
456
+ bn_reduce_once_in_place(r, carry, m, tmp, num);
455
457
  }
456
458
 
457
459
  int bn_div_consttime(BIGNUM *quotient, BIGNUM *remainder,
@@ -504,27 +506,14 @@ int bn_div_consttime(BIGNUM *quotient, BIGNUM *remainder,
504
506
  // extra word in |carry|.
505
507
  BN_ULONG carry = bn_add_words(r->d, r->d, r->d, divisor->width);
506
508
  r->d[0] |= (numerator->d[i] >> bit) & 1;
507
- // tmp = r - divisor. We use |bn_sub_words| to perform the bulk of the
508
- // subtraction, and then apply the borrow to |carry|.
509
- carry -= bn_sub_words(tmp->d, r->d, divisor->d, divisor->width);
510
509
  // |r| was previously fully-reduced, so we know:
511
- //
512
- // 2*0 - divisor <= tmp <= 2*(divisor-1) + 1 - divisor
513
- // -divisor <= tmp < divisor
514
- //
515
- // If 0 <= |tmp| < |divisor|, |tmp| fits in |divisor->width| and |carry|
516
- // is zero. We then wish to select |tmp|. Otherwise,
517
- // -|divisor| <= |tmp| < 0 and we wish to select |tmp| + |divisor|, which
518
- // is |r|. |carry| must then be -1 (all ones). In both cases, |carry| is a
519
- // suitable input to |bn_select_words|.
520
- //
521
- // Although |carry| may be one if |bn_add_words| returns one and
522
- // |bn_sub_words| returns zero, this would give |r| > |d|, which violates
523
- // the loop invariant.
524
- bn_select_words(r->d, carry, r->d /* tmp < 0 */, tmp->d /* tmp >= 0 */,
525
- divisor->width);
510
+ // 2*0 <= r <= 2*(divisor-1) + 1
511
+ // 0 <= r <= 2*divisor - 1 < 2*divisor.
512
+ // Thus |r| satisfies the preconditions for |bn_reduce_once_in_place|.
513
+ BN_ULONG subtracted = bn_reduce_once_in_place(r->d, carry, divisor->d,
514
+ tmp->d, divisor->width);
526
515
  // The corresponding bit of the quotient is set iff we needed to subtract.
527
- q->d[i] |= (~carry & 1) << bit;
516
+ q->d[i] |= (~subtracted & 1) << bit;
528
517
  }
529
518
  }
530
519
 
@@ -600,6 +589,7 @@ int bn_mod_add_consttime(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
600
589
  if (ok) {
601
590
  bn_mod_add_words(r->d, a->d, b->d, m->d, tmp->d, m->width);
602
591
  r->width = m->width;
592
+ r->neg = 0;
603
593
  }
604
594
  BN_CTX_end(ctx);
605
595
  return ok;
@@ -624,6 +614,7 @@ int bn_mod_sub_consttime(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
624
614
  if (ok) {
625
615
  bn_mod_sub_words(r->d, a->d, b->d, m->d, tmp->d, m->width);
626
616
  r->width = m->width;
617
+ r->neg = 0;
627
618
  }
628
619
  BN_CTX_end(ctx);
629
620
  return ok;