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
@@ -23,6 +23,7 @@
23
23
  #include <string.h>
24
24
 
25
25
  #include <openssl/bn.h>
26
+ #include <openssl/cpu.h>
26
27
  #include <openssl/crypto.h>
27
28
  #include <openssl/err.h>
28
29
 
@@ -47,7 +48,8 @@ static const BN_ULONG ONE[P256_LIMBS] = {
47
48
  // Precomputed tables for the default generator
48
49
  #include "p256-x86_64-table.h"
49
50
 
50
- // Recode window to a signed digit, see util-64.c for details
51
+ // Recode window to a signed digit, see |ec_GFp_nistp_recode_scalar_bits| in
52
+ // util.c for details
51
53
  static unsigned booth_recode_w5(unsigned in) {
52
54
  unsigned s, d;
53
55
 
@@ -197,19 +199,13 @@ static void ecp_nistz256_mod_inverse_mont(BN_ULONG r[P256_LIMBS],
197
199
  ecp_nistz256_mul_mont(r, res, in);
198
200
  }
199
201
 
200
- // ecp_nistz256_bignum_to_field_elem copies the contents of |in| to |out| and
201
- // returns one if it fits. Otherwise it returns zero.
202
- static int ecp_nistz256_bignum_to_field_elem(BN_ULONG out[P256_LIMBS],
203
- const BIGNUM *in) {
204
- return bn_copy_words(out, P256_LIMBS, in);
205
- }
206
-
207
202
  // r = p * p_scalar
208
- static int ecp_nistz256_windowed_mul(const EC_GROUP *group, P256_POINT *r,
209
- const EC_POINT *p,
210
- const EC_SCALAR *p_scalar) {
203
+ static void ecp_nistz256_windowed_mul(const EC_GROUP *group, P256_POINT *r,
204
+ const EC_RAW_POINT *p,
205
+ const EC_SCALAR *p_scalar) {
211
206
  assert(p != NULL);
212
207
  assert(p_scalar != NULL);
208
+ assert(group->field.width == P256_LIMBS);
213
209
 
214
210
  static const unsigned kWindowSize = 5;
215
211
  static const unsigned kMask = (1 << (5 /* kWindowSize */ + 1)) - 1;
@@ -226,13 +222,10 @@ static int ecp_nistz256_windowed_mul(const EC_GROUP *group, P256_POINT *r,
226
222
  // not stored. All other values are actually stored with an offset of -1 in
227
223
  // table.
228
224
  P256_POINT *row = table;
229
-
230
- if (!ecp_nistz256_bignum_to_field_elem(row[1 - 1].X, &p->X) ||
231
- !ecp_nistz256_bignum_to_field_elem(row[1 - 1].Y, &p->Y) ||
232
- !ecp_nistz256_bignum_to_field_elem(row[1 - 1].Z, &p->Z)) {
233
- OPENSSL_PUT_ERROR(EC, EC_R_COORDINATES_OUT_OF_RANGE);
234
- return 0;
235
- }
225
+ assert(group->field.width == P256_LIMBS);
226
+ OPENSSL_memcpy(row[1 - 1].X, p->X.words, P256_LIMBS * sizeof(BN_ULONG));
227
+ OPENSSL_memcpy(row[1 - 1].Y, p->Y.words, P256_LIMBS * sizeof(BN_ULONG));
228
+ OPENSSL_memcpy(row[1 - 1].Z, p->Z.words, P256_LIMBS * sizeof(BN_ULONG));
236
229
 
237
230
  ecp_nistz256_point_double(&row[2 - 1], &row[1 - 1]);
238
231
  ecp_nistz256_point_add(&row[3 - 1], &row[2 - 1], &row[1 - 1]);
@@ -296,110 +289,160 @@ static int ecp_nistz256_windowed_mul(const EC_GROUP *group, P256_POINT *r,
296
289
  copy_conditional(h.Y, tmp, wvalue & 1);
297
290
 
298
291
  ecp_nistz256_point_add(r, r, &h);
299
-
300
- return 1;
301
292
  }
302
293
 
303
- static int ecp_nistz256_points_mul(const EC_GROUP *group, EC_POINT *r,
304
- const EC_SCALAR *g_scalar,
305
- const EC_POINT *p_,
306
- const EC_SCALAR *p_scalar, BN_CTX *ctx) {
307
- assert((p_ != NULL) == (p_scalar != NULL));
294
+ typedef union {
295
+ P256_POINT p;
296
+ P256_POINT_AFFINE a;
297
+ } p256_point_union_t;
308
298
 
299
+ static unsigned calc_first_wvalue(unsigned *index, const uint8_t p_str[33]) {
309
300
  static const unsigned kWindowSize = 7;
310
301
  static const unsigned kMask = (1 << (7 /* kWindowSize */ + 1)) - 1;
302
+ *index = kWindowSize;
311
303
 
312
- alignas(32) union {
313
- P256_POINT p;
314
- P256_POINT_AFFINE a;
315
- } t, p;
304
+ unsigned wvalue = (p_str[0] << 1) & kMask;
305
+ return booth_recode_w7(wvalue);
306
+ }
307
+
308
+ static unsigned calc_wvalue(unsigned *index, const uint8_t p_str[33]) {
309
+ static const unsigned kWindowSize = 7;
310
+ static const unsigned kMask = (1 << (7 /* kWindowSize */ + 1)) - 1;
316
311
 
317
- if (g_scalar != NULL) {
318
- uint8_t p_str[33];
319
- OPENSSL_memcpy(p_str, g_scalar->bytes, 32);
320
- p_str[32] = 0;
312
+ const unsigned off = (*index - 1) / 8;
313
+ unsigned wvalue = p_str[off] | p_str[off + 1] << 8;
314
+ wvalue = (wvalue >> ((*index - 1) % 8)) & kMask;
315
+ *index += kWindowSize;
321
316
 
322
- // First window
323
- unsigned wvalue = (p_str[0] << 1) & kMask;
324
- unsigned index = kWindowSize;
317
+ return booth_recode_w7(wvalue);
318
+ }
325
319
 
326
- wvalue = booth_recode_w7(wvalue);
320
+ static void ecp_nistz256_point_mul(const EC_GROUP *group, EC_RAW_POINT *r,
321
+ const EC_RAW_POINT *p,
322
+ const EC_SCALAR *scalar) {
323
+ alignas(32) P256_POINT out;
324
+ ecp_nistz256_windowed_mul(group, &out, p, scalar);
327
325
 
328
- const PRECOMP256_ROW *const precomputed_table =
329
- (const PRECOMP256_ROW *)ecp_nistz256_precomputed;
330
- ecp_nistz256_select_w7(&p.a, precomputed_table[0], wvalue >> 1);
326
+ assert(group->field.width == P256_LIMBS);
327
+ OPENSSL_memcpy(r->X.words, out.X, P256_LIMBS * sizeof(BN_ULONG));
328
+ OPENSSL_memcpy(r->Y.words, out.Y, P256_LIMBS * sizeof(BN_ULONG));
329
+ OPENSSL_memcpy(r->Z.words, out.Z, P256_LIMBS * sizeof(BN_ULONG));
330
+ }
331
331
 
332
- ecp_nistz256_neg(p.p.Z, p.p.Y);
333
- copy_conditional(p.p.Y, p.p.Z, wvalue & 1);
332
+ static void ecp_nistz256_point_mul_base(const EC_GROUP *group, EC_RAW_POINT *r,
333
+ const EC_SCALAR *scalar) {
334
+ alignas(32) p256_point_union_t t, p;
334
335
 
335
- // Convert |p| from affine to Jacobian coordinates. We set Z to zero if |p|
336
- // is infinity and |ONE| otherwise. |p| was computed from the table, so it
337
- // is infinity iff |wvalue >> 1| is zero.
338
- OPENSSL_memset(p.p.Z, 0, sizeof(p.p.Z));
339
- copy_conditional(p.p.Z, ONE, is_not_zero(wvalue >> 1));
336
+ uint8_t p_str[33];
337
+ OPENSSL_memcpy(p_str, scalar->bytes, 32);
338
+ p_str[32] = 0;
340
339
 
341
- for (int i = 1; i < 37; i++) {
342
- unsigned off = (index - 1) / 8;
343
- wvalue = p_str[off] | p_str[off + 1] << 8;
344
- wvalue = (wvalue >> ((index - 1) % 8)) & kMask;
345
- index += kWindowSize;
340
+ // First window
341
+ unsigned index = 0;
342
+ unsigned wvalue = calc_first_wvalue(&index, p_str);
346
343
 
347
- wvalue = booth_recode_w7(wvalue);
344
+ ecp_nistz256_select_w7(&p.a, ecp_nistz256_precomputed[0], wvalue >> 1);
345
+ ecp_nistz256_neg(p.p.Z, p.p.Y);
346
+ copy_conditional(p.p.Y, p.p.Z, wvalue & 1);
348
347
 
349
- ecp_nistz256_select_w7(&t.a, precomputed_table[i], wvalue >> 1);
348
+ // Convert |p| from affine to Jacobian coordinates. We set Z to zero if |p|
349
+ // is infinity and |ONE| otherwise. |p| was computed from the table, so it
350
+ // is infinity iff |wvalue >> 1| is zero.
351
+ OPENSSL_memset(p.p.Z, 0, sizeof(p.p.Z));
352
+ copy_conditional(p.p.Z, ONE, is_not_zero(wvalue >> 1));
350
353
 
351
- ecp_nistz256_neg(t.p.Z, t.a.Y);
352
- copy_conditional(t.a.Y, t.p.Z, wvalue & 1);
354
+ for (int i = 1; i < 37; i++) {
355
+ wvalue = calc_wvalue(&index, p_str);
353
356
 
354
- ecp_nistz256_point_add_affine(&p.p, &p.p, &t.a);
355
- }
357
+ ecp_nistz256_select_w7(&t.a, ecp_nistz256_precomputed[i], wvalue >> 1);
358
+
359
+ ecp_nistz256_neg(t.p.Z, t.a.Y);
360
+ copy_conditional(t.a.Y, t.p.Z, wvalue & 1);
361
+
362
+ // Note |ecp_nistz256_point_add_affine| does not work if |p.p| and |t.a|
363
+ // are the same non-infinity point.
364
+ ecp_nistz256_point_add_affine(&p.p, &p.p, &t.a);
356
365
  }
357
366
 
358
- const int p_is_infinity = g_scalar == NULL;
359
- if (p_scalar != NULL) {
360
- P256_POINT *out = &t.p;
361
- if (p_is_infinity) {
362
- out = &p.p;
363
- }
367
+ assert(group->field.width == P256_LIMBS);
368
+ OPENSSL_memcpy(r->X.words, p.p.X, P256_LIMBS * sizeof(BN_ULONG));
369
+ OPENSSL_memcpy(r->Y.words, p.p.Y, P256_LIMBS * sizeof(BN_ULONG));
370
+ OPENSSL_memcpy(r->Z.words, p.p.Z, P256_LIMBS * sizeof(BN_ULONG));
371
+ }
364
372
 
365
- if (!ecp_nistz256_windowed_mul(group, out, p_, p_scalar)) {
366
- return 0;
367
- }
373
+ static void ecp_nistz256_points_mul_public(const EC_GROUP *group,
374
+ EC_RAW_POINT *r,
375
+ const EC_SCALAR *g_scalar,
376
+ const EC_RAW_POINT *p_,
377
+ const EC_SCALAR *p_scalar) {
378
+ assert(p_ != NULL && p_scalar != NULL && g_scalar != NULL);
368
379
 
369
- if (!p_is_infinity) {
370
- ecp_nistz256_point_add(&p.p, &p.p, out);
371
- }
380
+ alignas(32) p256_point_union_t t, p;
381
+ uint8_t p_str[33];
382
+ OPENSSL_memcpy(p_str, g_scalar->bytes, 32);
383
+ p_str[32] = 0;
384
+
385
+ // First window
386
+ unsigned index = 0;
387
+ unsigned wvalue = calc_first_wvalue(&index, p_str);
388
+
389
+ // Convert |p| from affine to Jacobian coordinates. We set Z to zero if |p|
390
+ // is infinity and |ONE| otherwise. |p| was computed from the table, so it
391
+ // is infinity iff |wvalue >> 1| is zero.
392
+ if ((wvalue >> 1) != 0) {
393
+ OPENSSL_memcpy(&p.a, &ecp_nistz256_precomputed[0][(wvalue >> 1) - 1],
394
+ sizeof(p.a));
395
+ OPENSSL_memcpy(&p.p.Z, ONE, sizeof(p.p.Z));
396
+ } else {
397
+ OPENSSL_memset(&p.a, 0, sizeof(p.a));
398
+ OPENSSL_memset(p.p.Z, 0, sizeof(p.p.Z));
372
399
  }
373
400
 
374
- // Not constant-time, but we're only operating on the public output.
375
- if (!bn_set_words(&r->X, p.p.X, P256_LIMBS) ||
376
- !bn_set_words(&r->Y, p.p.Y, P256_LIMBS) ||
377
- !bn_set_words(&r->Z, p.p.Z, P256_LIMBS)) {
378
- return 0;
401
+ if ((wvalue & 1) == 1) {
402
+ ecp_nistz256_neg(p.p.Y, p.p.Y);
379
403
  }
380
404
 
381
- return 1;
382
- }
405
+ for (int i = 1; i < 37; i++) {
406
+ wvalue = calc_wvalue(&index, p_str);
383
407
 
384
- static int ecp_nistz256_get_affine(const EC_GROUP *group, const EC_POINT *point,
385
- BIGNUM *x, BIGNUM *y, BN_CTX *ctx) {
386
- BN_ULONG z_inv2[P256_LIMBS];
387
- BN_ULONG z_inv3[P256_LIMBS];
388
- BN_ULONG point_x[P256_LIMBS], point_y[P256_LIMBS], point_z[P256_LIMBS];
408
+ if ((wvalue >> 1) == 0) {
409
+ continue;
410
+ }
389
411
 
390
- if (EC_POINT_is_at_infinity(group, point)) {
391
- OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY);
392
- return 0;
412
+ OPENSSL_memcpy(&t.a, &ecp_nistz256_precomputed[i][(wvalue >> 1) - 1],
413
+ sizeof(p.a));
414
+
415
+ if ((wvalue & 1) == 1) {
416
+ ecp_nistz256_neg(t.a.Y, t.a.Y);
417
+ }
418
+
419
+ // Note |ecp_nistz256_point_add_affine| does not work if |p.p| and |t.a|
420
+ // are the same non-infinity point, so it is important that we compute the
421
+ // |g_scalar| term before the |p_scalar| term.
422
+ ecp_nistz256_point_add_affine(&p.p, &p.p, &t.a);
393
423
  }
394
424
 
395
- if (!ecp_nistz256_bignum_to_field_elem(point_x, &point->X) ||
396
- !ecp_nistz256_bignum_to_field_elem(point_y, &point->Y) ||
397
- !ecp_nistz256_bignum_to_field_elem(point_z, &point->Z)) {
398
- OPENSSL_PUT_ERROR(EC, EC_R_COORDINATES_OUT_OF_RANGE);
425
+ ecp_nistz256_windowed_mul(group, &t.p, p_, p_scalar);
426
+ ecp_nistz256_point_add(&p.p, &p.p, &t.p);
427
+
428
+ assert(group->field.width == P256_LIMBS);
429
+ OPENSSL_memcpy(r->X.words, p.p.X, P256_LIMBS * sizeof(BN_ULONG));
430
+ OPENSSL_memcpy(r->Y.words, p.p.Y, P256_LIMBS * sizeof(BN_ULONG));
431
+ OPENSSL_memcpy(r->Z.words, p.p.Z, P256_LIMBS * sizeof(BN_ULONG));
432
+ }
433
+
434
+ static int ecp_nistz256_get_affine(const EC_GROUP *group,
435
+ const EC_RAW_POINT *point, EC_FELEM *x,
436
+ EC_FELEM *y) {
437
+ if (ec_GFp_simple_is_at_infinity(group, point)) {
438
+ OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY);
399
439
  return 0;
400
440
  }
401
441
 
402
- ecp_nistz256_mod_inverse_mont(z_inv3, point_z);
442
+ BN_ULONG z_inv2[P256_LIMBS];
443
+ BN_ULONG z_inv3[P256_LIMBS];
444
+ assert(group->field.width == P256_LIMBS);
445
+ ecp_nistz256_mod_inverse_mont(z_inv3, point->Z.words);
403
446
  ecp_nistz256_sqr_mont(z_inv2, z_inv3);
404
447
 
405
448
  // Instead of using |ecp_nistz256_from_mont| to convert the |x| coordinate
@@ -409,39 +452,200 @@ static int ecp_nistz256_get_affine(const EC_GROUP *group, const EC_POINT *point,
409
452
  ecp_nistz256_from_mont(z_inv2, z_inv2);
410
453
 
411
454
  if (x != NULL) {
412
- BN_ULONG x_aff[P256_LIMBS];
413
- ecp_nistz256_mul_mont(x_aff, z_inv2, point_x);
414
- if (!bn_set_words(x, x_aff, P256_LIMBS)) {
415
- OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE);
416
- return 0;
417
- }
455
+ ecp_nistz256_mul_mont(x->words, z_inv2, point->X.words);
418
456
  }
419
457
 
420
458
  if (y != NULL) {
421
- BN_ULONG y_aff[P256_LIMBS];
422
459
  ecp_nistz256_mul_mont(z_inv3, z_inv3, z_inv2);
423
- ecp_nistz256_mul_mont(y_aff, z_inv3, point_y);
424
- if (!bn_set_words(y, y_aff, P256_LIMBS)) {
425
- OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE);
426
- return 0;
427
- }
460
+ ecp_nistz256_mul_mont(y->words, z_inv3, point->Y.words);
428
461
  }
429
462
 
430
463
  return 1;
431
464
  }
432
465
 
466
+ static void ecp_nistz256_add(const EC_GROUP *group, EC_RAW_POINT *r,
467
+ const EC_RAW_POINT *a_, const EC_RAW_POINT *b_) {
468
+ P256_POINT a, b;
469
+ OPENSSL_memcpy(a.X, a_->X.words, P256_LIMBS * sizeof(BN_ULONG));
470
+ OPENSSL_memcpy(a.Y, a_->Y.words, P256_LIMBS * sizeof(BN_ULONG));
471
+ OPENSSL_memcpy(a.Z, a_->Z.words, P256_LIMBS * sizeof(BN_ULONG));
472
+ OPENSSL_memcpy(b.X, b_->X.words, P256_LIMBS * sizeof(BN_ULONG));
473
+ OPENSSL_memcpy(b.Y, b_->Y.words, P256_LIMBS * sizeof(BN_ULONG));
474
+ OPENSSL_memcpy(b.Z, b_->Z.words, P256_LIMBS * sizeof(BN_ULONG));
475
+ ecp_nistz256_point_add(&a, &a, &b);
476
+ OPENSSL_memcpy(r->X.words, a.X, P256_LIMBS * sizeof(BN_ULONG));
477
+ OPENSSL_memcpy(r->Y.words, a.Y, P256_LIMBS * sizeof(BN_ULONG));
478
+ OPENSSL_memcpy(r->Z.words, a.Z, P256_LIMBS * sizeof(BN_ULONG));
479
+ }
480
+
481
+ static void ecp_nistz256_dbl(const EC_GROUP *group, EC_RAW_POINT *r,
482
+ const EC_RAW_POINT *a_) {
483
+ P256_POINT a;
484
+ OPENSSL_memcpy(a.X, a_->X.words, P256_LIMBS * sizeof(BN_ULONG));
485
+ OPENSSL_memcpy(a.Y, a_->Y.words, P256_LIMBS * sizeof(BN_ULONG));
486
+ OPENSSL_memcpy(a.Z, a_->Z.words, P256_LIMBS * sizeof(BN_ULONG));
487
+ ecp_nistz256_point_double(&a, &a);
488
+ OPENSSL_memcpy(r->X.words, a.X, P256_LIMBS * sizeof(BN_ULONG));
489
+ OPENSSL_memcpy(r->Y.words, a.Y, P256_LIMBS * sizeof(BN_ULONG));
490
+ OPENSSL_memcpy(r->Z.words, a.Z, P256_LIMBS * sizeof(BN_ULONG));
491
+ }
492
+
493
+ static void ecp_nistz256_inv_mod_ord(const EC_GROUP *group, EC_SCALAR *out,
494
+ const EC_SCALAR *in) {
495
+ // table[i] stores a power of |in| corresponding to the matching enum value.
496
+ enum {
497
+ // The following indices specify the power in binary.
498
+ i_1 = 0,
499
+ i_10,
500
+ i_11,
501
+ i_101,
502
+ i_111,
503
+ i_1010,
504
+ i_1111,
505
+ i_10101,
506
+ i_101010,
507
+ i_101111,
508
+ // The following indices specify 2^N-1, or N ones in a row.
509
+ i_x6,
510
+ i_x8,
511
+ i_x16,
512
+ i_x32
513
+ };
514
+ BN_ULONG table[15][P256_LIMBS];
515
+
516
+ // https://briansmith.org/ecc-inversion-addition-chains-01#p256_scalar_inversion
517
+ //
518
+ // Even though this code path spares 12 squarings, 4.5%, and 13
519
+ // multiplications, 25%, the overall sign operation is not that much faster,
520
+ // not more that 2%. Most of the performance of this function comes from the
521
+ // scalar operations.
522
+
523
+ // Pre-calculate powers.
524
+ OPENSSL_memcpy(table[i_1], in->words, P256_LIMBS * sizeof(BN_ULONG));
525
+
526
+ ecp_nistz256_ord_sqr_mont(table[i_10], table[i_1], 1);
527
+
528
+ ecp_nistz256_ord_mul_mont(table[i_11], table[i_1], table[i_10]);
529
+
530
+ ecp_nistz256_ord_mul_mont(table[i_101], table[i_11], table[i_10]);
531
+
532
+ ecp_nistz256_ord_mul_mont(table[i_111], table[i_101], table[i_10]);
533
+
534
+ ecp_nistz256_ord_sqr_mont(table[i_1010], table[i_101], 1);
535
+
536
+ ecp_nistz256_ord_mul_mont(table[i_1111], table[i_1010], table[i_101]);
537
+
538
+ ecp_nistz256_ord_sqr_mont(table[i_10101], table[i_1010], 1);
539
+ ecp_nistz256_ord_mul_mont(table[i_10101], table[i_10101], table[i_1]);
540
+
541
+ ecp_nistz256_ord_sqr_mont(table[i_101010], table[i_10101], 1);
542
+
543
+ ecp_nistz256_ord_mul_mont(table[i_101111], table[i_101010], table[i_101]);
544
+
545
+ ecp_nistz256_ord_mul_mont(table[i_x6], table[i_101010], table[i_10101]);
546
+
547
+ ecp_nistz256_ord_sqr_mont(table[i_x8], table[i_x6], 2);
548
+ ecp_nistz256_ord_mul_mont(table[i_x8], table[i_x8], table[i_11]);
549
+
550
+ ecp_nistz256_ord_sqr_mont(table[i_x16], table[i_x8], 8);
551
+ ecp_nistz256_ord_mul_mont(table[i_x16], table[i_x16], table[i_x8]);
552
+
553
+ ecp_nistz256_ord_sqr_mont(table[i_x32], table[i_x16], 16);
554
+ ecp_nistz256_ord_mul_mont(table[i_x32], table[i_x32], table[i_x16]);
555
+
556
+ // Compute |in| raised to the order-2.
557
+ ecp_nistz256_ord_sqr_mont(out->words, table[i_x32], 64);
558
+ ecp_nistz256_ord_mul_mont(out->words, out->words, table[i_x32]);
559
+ static const struct {
560
+ uint8_t p, i;
561
+ } kChain[27] = {{32, i_x32}, {6, i_101111}, {5, i_111}, {4, i_11},
562
+ {5, i_1111}, {5, i_10101}, {4, i_101}, {3, i_101},
563
+ {3, i_101}, {5, i_111}, {9, i_101111}, {6, i_1111},
564
+ {2, i_1}, {5, i_1}, {6, i_1111}, {5, i_111},
565
+ {4, i_111}, {5, i_111}, {5, i_101}, {3, i_11},
566
+ {10, i_101111}, {2, i_11}, {5, i_11}, {5, i_11},
567
+ {3, i_1}, {7, i_10101}, {6, i_1111}};
568
+ for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kChain); i++) {
569
+ ecp_nistz256_ord_sqr_mont(out->words, out->words, kChain[i].p);
570
+ ecp_nistz256_ord_mul_mont(out->words, out->words, table[kChain[i].i]);
571
+ }
572
+ }
573
+
574
+ static int ecp_nistz256_mont_inv_mod_ord_vartime(const EC_GROUP *group,
575
+ EC_SCALAR *out,
576
+ const EC_SCALAR *in) {
577
+ if ((OPENSSL_ia32cap_get()[1] & (1 << 28)) == 0) {
578
+ // No AVX support; fallback to generic code.
579
+ return ec_GFp_simple_mont_inv_mod_ord_vartime(group, out, in);
580
+ }
581
+
582
+ assert(group->order.width == P256_LIMBS);
583
+ if (!beeu_mod_inverse_vartime(out->words, in->words, group->order.d)) {
584
+ return 0;
585
+ }
586
+
587
+ // The result should be returned in the Montgomery domain.
588
+ ec_scalar_to_montgomery(group, out, out);
589
+ return 1;
590
+ }
591
+
592
+ static int ecp_nistz256_cmp_x_coordinate(const EC_GROUP *group,
593
+ const EC_RAW_POINT *p,
594
+ const EC_SCALAR *r) {
595
+ if (ec_GFp_simple_is_at_infinity(group, p)) {
596
+ return 0;
597
+ }
598
+
599
+ assert(group->order.width == P256_LIMBS);
600
+ assert(group->field.width == P256_LIMBS);
601
+
602
+ // We wish to compare X/Z^2 with r. This is equivalent to comparing X with
603
+ // r*Z^2. Note that X and Z are represented in Montgomery form, while r is
604
+ // not.
605
+ BN_ULONG r_Z2[P256_LIMBS], Z2_mont[P256_LIMBS], X[P256_LIMBS];
606
+ ecp_nistz256_mul_mont(Z2_mont, p->Z.words, p->Z.words);
607
+ ecp_nistz256_mul_mont(r_Z2, r->words, Z2_mont);
608
+ ecp_nistz256_from_mont(X, p->X.words);
609
+
610
+ if (OPENSSL_memcmp(r_Z2, X, sizeof(r_Z2)) == 0) {
611
+ return 1;
612
+ }
613
+
614
+ // During signing the x coefficient is reduced modulo the group order.
615
+ // Therefore there is a small possibility, less than 1/2^128, that group_order
616
+ // < p.x < P. in that case we need not only to compare against |r| but also to
617
+ // compare against r+group_order.
618
+ if (bn_less_than_words(r->words, group->field_minus_order.words,
619
+ P256_LIMBS)) {
620
+ // We can ignore the carry because: r + group_order < p < 2^256.
621
+ bn_add_words(r_Z2, r->words, group->order.d, P256_LIMBS);
622
+ ecp_nistz256_mul_mont(r_Z2, r_Z2, Z2_mont);
623
+ if (OPENSSL_memcmp(r_Z2, X, sizeof(r_Z2)) == 0) {
624
+ return 1;
625
+ }
626
+ }
627
+
628
+ return 0;
629
+ }
630
+
433
631
  DEFINE_METHOD_FUNCTION(EC_METHOD, EC_GFp_nistz256_method) {
434
632
  out->group_init = ec_GFp_mont_group_init;
435
633
  out->group_finish = ec_GFp_mont_group_finish;
436
634
  out->group_set_curve = ec_GFp_mont_group_set_curve;
437
635
  out->point_get_affine_coordinates = ecp_nistz256_get_affine;
438
- out->mul = ecp_nistz256_points_mul;
439
- out->mul_public = ecp_nistz256_points_mul;
440
- out->field_mul = ec_GFp_mont_field_mul;
441
- out->field_sqr = ec_GFp_mont_field_sqr;
442
- out->field_encode = ec_GFp_mont_field_encode;
443
- out->field_decode = ec_GFp_mont_field_decode;
444
- };
636
+ out->add = ecp_nistz256_add;
637
+ out->dbl = ecp_nistz256_dbl;
638
+ out->mul = ecp_nistz256_point_mul;
639
+ out->mul_base = ecp_nistz256_point_mul_base;
640
+ out->mul_public = ecp_nistz256_points_mul_public;
641
+ out->felem_mul = ec_GFp_mont_felem_mul;
642
+ out->felem_sqr = ec_GFp_mont_felem_sqr;
643
+ out->bignum_to_felem = ec_GFp_mont_bignum_to_felem;
644
+ out->felem_to_bignum = ec_GFp_mont_felem_to_bignum;
645
+ out->scalar_inv_montgomery = ecp_nistz256_inv_mod_ord;
646
+ out->scalar_inv_montgomery_vartime = ecp_nistz256_mont_inv_mod_ord_vartime;
647
+ out->cmp_x_coordinate = ecp_nistz256_cmp_x_coordinate;
648
+ }
445
649
 
446
650
  #endif /* !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && \
447
651
  !defined(OPENSSL_SMALL) */