grpc 1.24.0 → 1.25.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (504) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +306 -243
  3. data/etc/roots.pem +0 -100
  4. data/include/grpc/grpc_security.h +44 -18
  5. data/include/grpc/impl/codegen/grpc_types.h +15 -0
  6. data/include/grpc/impl/codegen/port_platform.h +27 -11
  7. data/include/grpc/impl/codegen/sync_generic.h +1 -1
  8. data/src/boringssl/err_data.c +695 -650
  9. data/src/core/ext/filters/client_channel/client_channel.cc +257 -179
  10. data/src/core/ext/filters/client_channel/client_channel.h +24 -0
  11. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +2 -3
  12. data/src/core/ext/filters/client_channel/client_channel_factory.h +1 -5
  13. data/src/core/ext/filters/client_channel/health/health_check_client.cc +18 -45
  14. data/src/core/ext/filters/client_channel/health/health_check_client.h +5 -13
  15. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -3
  17. data/src/core/ext/filters/client_channel/lb_policy.h +65 -55
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +14 -14
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +113 -36
  20. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +14 -19
  21. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +36 -13
  22. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +3 -10
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +814 -1589
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +2 -5
  25. data/src/core/ext/filters/client_channel/lb_policy_factory.h +3 -6
  26. data/src/core/ext/filters/client_channel/resolver.cc +1 -2
  27. data/src/core/ext/filters/client_channel/resolver.h +8 -16
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +25 -8
  29. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +46 -12
  30. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +10 -17
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +7 -8
  32. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  33. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +111 -44
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +22 -14
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  37. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +29 -10
  38. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +27 -36
  39. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +7 -10
  40. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +60 -16
  41. data/src/core/ext/filters/client_channel/resolver_factory.h +4 -8
  42. data/src/core/ext/filters/client_channel/resolver_registry.cc +1 -1
  43. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -10
  45. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +1 -1
  47. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -5
  48. data/src/core/ext/filters/client_channel/retry_throttle.h +1 -4
  49. data/src/core/ext/filters/client_channel/service_config.h +8 -8
  50. data/src/core/ext/filters/client_channel/subchannel.cc +53 -86
  51. data/src/core/ext/filters/client_channel/subchannel.h +7 -9
  52. data/src/core/ext/filters/client_channel/subchannel_interface.h +9 -13
  53. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +3 -6
  54. data/src/core/ext/filters/client_channel/{lb_policy/xds/xds_load_balancer_api.cc → xds/xds_api.cc} +169 -52
  55. data/src/core/ext/filters/client_channel/xds/xds_api.h +171 -0
  56. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +450 -0
  57. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +99 -0
  58. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_channel.h +8 -6
  59. data/src/core/ext/filters/client_channel/xds/xds_channel_args.h +26 -0
  60. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_channel_secure.cc +28 -11
  61. data/src/core/ext/filters/client_channel/xds/xds_client.cc +1413 -0
  62. data/src/core/ext/filters/client_channel/xds/xds_client.h +221 -0
  63. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_client_stats.cc +1 -5
  64. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_client_stats.h +3 -4
  65. data/src/core/ext/filters/deadline/deadline_filter.cc +20 -20
  66. data/src/core/ext/filters/http/client/http_client_filter.cc +15 -15
  67. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  68. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +12 -12
  69. data/src/core/ext/filters/max_age/max_age_filter.cc +59 -50
  70. data/src/core/ext/filters/message_size/message_size_filter.cc +18 -18
  71. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +15 -14
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +233 -175
  73. data/src/core/ext/transport/chttp2/transport/flow_control.h +21 -24
  74. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +253 -163
  75. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +24 -12
  76. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -3
  77. data/src/core/ext/transport/chttp2/transport/internal.h +13 -15
  78. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -0
  79. data/src/core/ext/transport/inproc/inproc_transport.cc +20 -13
  80. data/src/core/lib/channel/channel_args.cc +16 -0
  81. data/src/core/lib/channel/channel_args.h +22 -0
  82. data/src/core/lib/channel/channelz.cc +5 -6
  83. data/src/core/lib/channel/channelz.h +1 -1
  84. data/src/core/lib/channel/connected_channel.cc +20 -20
  85. data/src/core/lib/channel/handshaker.h +3 -4
  86. data/src/core/lib/channel/handshaker_factory.h +1 -3
  87. data/src/core/lib/debug/trace.h +3 -2
  88. data/src/core/lib/gprpp/arena.cc +3 -3
  89. data/src/core/lib/gprpp/arena.h +2 -3
  90. data/src/core/lib/gprpp/inlined_vector.h +9 -0
  91. data/src/core/lib/gprpp/map.h +3 -501
  92. data/src/core/lib/gprpp/memory.h +45 -41
  93. data/src/core/lib/gprpp/mpscq.cc +108 -0
  94. data/src/core/lib/gprpp/mpscq.h +98 -0
  95. data/src/core/lib/gprpp/orphanable.h +6 -11
  96. data/src/core/lib/gprpp/ref_counted.h +25 -19
  97. data/src/core/lib/gprpp/set.h +33 -0
  98. data/src/core/lib/gprpp/thd.h +2 -4
  99. data/src/core/lib/http/httpcli.cc +1 -1
  100. data/src/core/lib/http/httpcli_security_connector.cc +15 -11
  101. data/src/core/lib/http/parser.cc +1 -1
  102. data/src/core/lib/iomgr/buffer_list.cc +4 -5
  103. data/src/core/lib/iomgr/buffer_list.h +5 -6
  104. data/src/core/lib/iomgr/call_combiner.cc +4 -5
  105. data/src/core/lib/iomgr/call_combiner.h +2 -2
  106. data/src/core/lib/iomgr/cfstream_handle.h +3 -5
  107. data/src/core/lib/iomgr/closure.h +8 -3
  108. data/src/core/lib/iomgr/combiner.cc +45 -82
  109. data/src/core/lib/iomgr/combiner.h +32 -8
  110. data/src/core/lib/iomgr/endpoint_cfstream.cc +5 -3
  111. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -15
  112. data/src/core/lib/iomgr/exec_ctx.h +4 -3
  113. data/src/core/lib/iomgr/executor.cc +4 -2
  114. data/src/core/lib/iomgr/executor.h +3 -0
  115. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -6
  116. data/src/core/lib/iomgr/executor/threadpool.cc +1 -2
  117. data/src/core/lib/iomgr/executor/threadpool.h +7 -11
  118. data/src/core/lib/iomgr/resource_quota.cc +55 -51
  119. data/src/core/lib/iomgr/resource_quota.h +13 -9
  120. data/src/core/lib/iomgr/socket_utils_common_posix.cc +13 -0
  121. data/src/core/lib/iomgr/socket_utils_posix.h +4 -0
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -11
  123. data/src/core/lib/iomgr/tcp_custom.cc +9 -7
  124. data/src/core/lib/iomgr/tcp_posix.cc +20 -16
  125. data/src/core/lib/iomgr/tcp_server.h +1 -4
  126. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
  127. data/src/core/lib/iomgr/tcp_server_posix.cc +1 -1
  128. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -11
  129. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  130. data/src/core/lib/iomgr/udp_server.cc +3 -2
  131. data/src/core/lib/iomgr/udp_server.h +6 -12
  132. data/src/core/lib/json/json.h +1 -1
  133. data/src/core/lib/json/json_string.cc +2 -2
  134. data/src/core/lib/profiling/basic_timers.cc +2 -2
  135. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -2
  136. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -1
  137. data/src/core/lib/security/credentials/credentials.h +4 -20
  138. data/src/core/lib/security/credentials/fake/fake_credentials.cc +4 -4
  139. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -3
  140. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +64 -0
  141. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +4 -4
  142. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -7
  143. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -0
  144. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -4
  145. data/src/core/lib/security/security_connector/security_connector.cc +1 -0
  146. data/src/core/lib/security/security_connector/security_connector.h +19 -17
  147. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +8 -5
  148. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  149. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  150. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +14 -6
  151. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +4 -2
  152. data/src/core/lib/security/transport/client_auth_filter.cc +17 -17
  153. data/src/core/lib/security/transport/security_handshaker.cc +29 -13
  154. data/src/core/lib/security/transport/security_handshaker.h +4 -2
  155. data/src/core/lib/security/transport/server_auth_filter.cc +14 -14
  156. data/src/core/lib/slice/slice.cc +2 -10
  157. data/src/core/lib/slice/slice_hash_table.h +4 -6
  158. data/src/core/lib/slice/slice_intern.cc +42 -39
  159. data/src/core/lib/slice/slice_internal.h +3 -3
  160. data/src/core/lib/slice/slice_utils.h +21 -4
  161. data/src/core/lib/slice/slice_weak_hash_table.h +4 -6
  162. data/src/core/lib/surface/call.cc +3 -3
  163. data/src/core/lib/surface/channel.cc +7 -0
  164. data/src/core/lib/surface/completion_queue.cc +12 -11
  165. data/src/core/lib/surface/completion_queue.h +4 -2
  166. data/src/core/lib/surface/init.cc +1 -0
  167. data/src/core/lib/surface/lame_client.cc +33 -18
  168. data/src/core/lib/surface/server.cc +77 -76
  169. data/src/core/lib/surface/version.cc +1 -1
  170. data/src/core/lib/transport/byte_stream.h +3 -7
  171. data/src/core/lib/transport/connectivity_state.cc +112 -98
  172. data/src/core/lib/transport/connectivity_state.h +100 -50
  173. data/src/core/lib/transport/static_metadata.cc +276 -288
  174. data/src/core/lib/transport/static_metadata.h +73 -76
  175. data/src/core/lib/transport/status_conversion.cc +1 -1
  176. data/src/core/lib/transport/status_metadata.cc +1 -1
  177. data/src/core/lib/transport/transport.cc +2 -2
  178. data/src/core/lib/transport/transport.h +12 -4
  179. data/src/core/lib/transport/transport_op_string.cc +14 -11
  180. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +1 -1
  181. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +1 -1
  182. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +5 -5
  183. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -2
  184. data/src/core/tsi/fake_transport_security.cc +7 -5
  185. data/src/core/tsi/grpc_shadow_boringssl.h +2918 -2627
  186. data/src/core/tsi/local_transport_security.cc +8 -6
  187. data/src/core/tsi/ssl/session_cache/ssl_session.h +1 -3
  188. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -2
  189. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +7 -5
  190. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -6
  191. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -2
  192. data/src/core/tsi/ssl_transport_security.cc +12 -12
  193. data/src/core/tsi/ssl_transport_security.h +2 -2
  194. data/src/core/tsi/transport_security_grpc.cc +7 -0
  195. data/src/core/tsi/transport_security_grpc.h +6 -0
  196. data/src/ruby/ext/grpc/extconf.rb +1 -0
  197. data/src/ruby/ext/grpc/rb_call.c +1 -1
  198. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  199. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  200. data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
  201. data/src/ruby/lib/grpc/version.rb +1 -1
  202. data/src/ruby/spec/google_rpc_status_utils_spec.rb +2 -2
  203. data/third_party/boringssl/crypto/asn1/a_bool.c +18 -5
  204. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +17 -221
  205. data/third_party/boringssl/crypto/asn1/a_dup.c +0 -24
  206. data/third_party/boringssl/crypto/asn1/a_enum.c +2 -2
  207. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +10 -72
  208. data/third_party/boringssl/crypto/asn1/a_int.c +12 -71
  209. data/third_party/boringssl/crypto/asn1/a_mbstr.c +110 -216
  210. data/third_party/boringssl/crypto/asn1/a_object.c +16 -5
  211. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  212. data/third_party/boringssl/crypto/asn1/asn1_lib.c +5 -1
  213. data/third_party/boringssl/crypto/asn1/tasn_enc.c +3 -1
  214. data/third_party/boringssl/crypto/base64/base64.c +2 -2
  215. data/third_party/boringssl/crypto/bio/bio.c +73 -9
  216. data/third_party/boringssl/crypto/bio/connect.c +4 -0
  217. data/third_party/boringssl/crypto/bio/fd.c +4 -0
  218. data/third_party/boringssl/crypto/bio/file.c +5 -2
  219. data/third_party/boringssl/crypto/bio/socket.c +4 -0
  220. data/third_party/boringssl/crypto/bio/socket_helper.c +4 -0
  221. data/third_party/boringssl/crypto/bn_extra/convert.c +11 -7
  222. data/third_party/boringssl/crypto/bytestring/ber.c +8 -4
  223. data/third_party/boringssl/crypto/bytestring/cbb.c +19 -7
  224. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -15
  225. data/third_party/boringssl/crypto/bytestring/internal.h +28 -7
  226. data/third_party/boringssl/crypto/bytestring/unicode.c +155 -0
  227. data/third_party/boringssl/crypto/chacha/chacha.c +36 -19
  228. data/third_party/boringssl/crypto/chacha/internal.h +45 -0
  229. data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +29 -0
  230. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +269 -25
  231. data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +16 -14
  232. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +54 -38
  233. data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +133 -41
  234. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +23 -15
  235. data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +24 -15
  236. data/third_party/boringssl/crypto/cmac/cmac.c +62 -25
  237. data/third_party/boringssl/crypto/conf/conf.c +7 -0
  238. data/third_party/boringssl/crypto/cpu-arm-linux.c +4 -148
  239. data/third_party/boringssl/crypto/cpu-arm-linux.h +201 -0
  240. data/third_party/boringssl/crypto/cpu-intel.c +45 -51
  241. data/third_party/boringssl/crypto/crypto.c +39 -22
  242. data/third_party/boringssl/crypto/curve25519/spake25519.c +1 -1
  243. data/third_party/boringssl/crypto/dsa/dsa.c +77 -53
  244. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +20 -8
  245. data/third_party/boringssl/crypto/ec_extra/ec_derive.c +96 -0
  246. data/third_party/boringssl/crypto/{ecdh/ecdh.c → ecdh_extra/ecdh_extra.c} +20 -58
  247. data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +1 -9
  248. data/third_party/boringssl/crypto/engine/engine.c +2 -1
  249. data/third_party/boringssl/crypto/err/err.c +2 -0
  250. data/third_party/boringssl/crypto/err/internal.h +2 -2
  251. data/third_party/boringssl/crypto/evp/evp.c +89 -8
  252. data/third_party/boringssl/crypto/evp/evp_asn1.c +56 -5
  253. data/third_party/boringssl/crypto/evp/evp_ctx.c +52 -14
  254. data/third_party/boringssl/crypto/evp/internal.h +18 -1
  255. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +5 -0
  256. data/third_party/boringssl/crypto/evp/p_ec.c +51 -3
  257. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +6 -7
  258. data/third_party/boringssl/crypto/evp/p_ed25519.c +36 -3
  259. data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +76 -45
  260. data/third_party/boringssl/crypto/evp/p_rsa.c +3 -1
  261. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +5 -0
  262. data/third_party/boringssl/crypto/evp/p_x25519.c +110 -0
  263. data/third_party/boringssl/crypto/evp/p_x25519_asn1.c +249 -0
  264. data/third_party/boringssl/crypto/evp/scrypt.c +6 -2
  265. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +34 -274
  266. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +161 -21
  267. data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +111 -13
  268. data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +17 -21
  269. data/third_party/boringssl/crypto/fipsmodule/bcm.c +119 -7
  270. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +19 -2
  271. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +2 -2
  272. data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +93 -160
  273. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +48 -57
  274. data/third_party/boringssl/crypto/fipsmodule/bn/div_extra.c +87 -0
  275. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +143 -211
  276. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +0 -305
  277. data/third_party/boringssl/crypto/fipsmodule/bn/gcd_extra.c +325 -0
  278. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +168 -50
  279. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +68 -92
  280. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +7 -6
  281. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +11 -14
  282. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +358 -443
  283. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +25 -35
  284. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +20 -25
  285. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +76 -5
  286. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +14 -14
  287. data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +7 -2
  288. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +383 -516
  289. data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +4 -0
  290. data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +3 -4
  291. data/third_party/boringssl/crypto/fipsmodule/delocate.h +3 -2
  292. data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +32 -17
  293. data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +3 -3
  294. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +228 -122
  295. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +34 -8
  296. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +311 -98
  297. data/third_party/boringssl/crypto/fipsmodule/ec/felem.c +82 -0
  298. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +263 -97
  299. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +22 -59
  300. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +317 -234
  301. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +9473 -9475
  302. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +313 -109
  303. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +36 -0
  304. data/third_party/boringssl/crypto/fipsmodule/ec/scalar.c +96 -0
  305. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +126 -792
  306. data/third_party/boringssl/crypto/fipsmodule/ec/simple_mul.c +84 -0
  307. data/third_party/boringssl/crypto/fipsmodule/ec/util.c +163 -12
  308. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +84 -211
  309. data/third_party/boringssl/crypto/fipsmodule/ecdh/ecdh.c +122 -0
  310. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +60 -205
  311. data/third_party/boringssl/crypto/fipsmodule/fips_shared_support.c +32 -0
  312. data/third_party/boringssl/crypto/fipsmodule/is_fips.c +2 -0
  313. data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +3 -1
  314. data/third_party/boringssl/crypto/fipsmodule/md5/internal.h +37 -0
  315. data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +11 -8
  316. data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +35 -79
  317. data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +7 -39
  318. data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +7 -27
  319. data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +123 -309
  320. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +189 -126
  321. data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +3 -2
  322. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +2 -2
  323. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +35 -0
  324. data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +24 -19
  325. data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +256 -77
  326. data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +10 -7
  327. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +5 -1
  328. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +131 -14
  329. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +83 -10
  330. data/third_party/boringssl/crypto/fipsmodule/sha/internal.h +53 -0
  331. data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +9 -13
  332. data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +18 -12
  333. data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +95 -168
  334. data/third_party/boringssl/crypto/hrss/hrss.c +2201 -0
  335. data/third_party/boringssl/crypto/hrss/internal.h +62 -0
  336. data/third_party/boringssl/crypto/internal.h +95 -20
  337. data/third_party/boringssl/crypto/lhash/lhash.c +45 -33
  338. data/third_party/boringssl/crypto/mem.c +39 -2
  339. data/third_party/boringssl/crypto/obj/obj.c +4 -4
  340. data/third_party/boringssl/crypto/obj/obj_dat.h +6181 -875
  341. data/third_party/boringssl/crypto/pem/pem_all.c +2 -3
  342. data/third_party/boringssl/crypto/pem/pem_info.c +144 -162
  343. data/third_party/boringssl/crypto/pem/pem_lib.c +53 -52
  344. data/third_party/boringssl/crypto/pem/pem_pkey.c +13 -21
  345. data/third_party/boringssl/crypto/pkcs7/pkcs7.c +15 -22
  346. data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +168 -16
  347. data/third_party/boringssl/crypto/pkcs8/internal.h +11 -0
  348. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +24 -15
  349. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +42 -25
  350. data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +559 -43
  351. data/third_party/boringssl/crypto/pool/internal.h +1 -1
  352. data/third_party/boringssl/crypto/pool/pool.c +21 -0
  353. data/third_party/boringssl/crypto/rand_extra/deterministic.c +8 -0
  354. data/third_party/boringssl/crypto/rand_extra/fuchsia.c +1 -14
  355. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  356. data/third_party/boringssl/crypto/rsa_extra/rsa_print.c +22 -0
  357. data/third_party/boringssl/crypto/siphash/siphash.c +80 -0
  358. data/third_party/boringssl/crypto/stack/stack.c +83 -32
  359. data/third_party/boringssl/crypto/thread_none.c +2 -2
  360. data/third_party/boringssl/crypto/thread_pthread.c +2 -2
  361. data/third_party/boringssl/crypto/thread_win.c +38 -19
  362. data/third_party/boringssl/crypto/x509/a_strex.c +22 -2
  363. data/third_party/boringssl/crypto/x509/asn1_gen.c +2 -1
  364. data/third_party/boringssl/crypto/x509/by_dir.c +7 -0
  365. data/third_party/boringssl/crypto/x509/by_file.c +12 -10
  366. data/third_party/boringssl/crypto/x509/t_crl.c +5 -8
  367. data/third_party/boringssl/crypto/x509/t_req.c +1 -3
  368. data/third_party/boringssl/crypto/x509/t_x509.c +5 -8
  369. data/third_party/boringssl/crypto/x509/x509_cmp.c +1 -1
  370. data/third_party/boringssl/crypto/x509/x509_def.c +1 -1
  371. data/third_party/boringssl/crypto/x509/x509_lu.c +114 -5
  372. data/third_party/boringssl/crypto/x509/x509_req.c +20 -0
  373. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  374. data/third_party/boringssl/crypto/x509/x509_trs.c +1 -0
  375. data/third_party/boringssl/crypto/x509/x509_txt.c +4 -5
  376. data/third_party/boringssl/crypto/x509/x509_vfy.c +145 -138
  377. data/third_party/boringssl/crypto/x509/x509_vpm.c +2 -0
  378. data/third_party/boringssl/crypto/x509/x509cset.c +40 -0
  379. data/third_party/boringssl/crypto/x509/x509name.c +2 -3
  380. data/third_party/boringssl/crypto/x509/x_all.c +109 -210
  381. data/third_party/boringssl/crypto/x509/x_x509.c +6 -0
  382. data/third_party/boringssl/crypto/x509v3/ext_dat.h +1 -3
  383. data/third_party/boringssl/crypto/x509v3/internal.h +56 -0
  384. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -0
  385. data/third_party/boringssl/crypto/x509v3/pcy_node.c +1 -0
  386. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +4 -2
  387. data/third_party/boringssl/crypto/x509v3/v3_akey.c +5 -2
  388. data/third_party/boringssl/crypto/x509v3/v3_alt.c +19 -13
  389. data/third_party/boringssl/crypto/x509v3/v3_conf.c +2 -1
  390. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +3 -2
  391. data/third_party/boringssl/crypto/x509v3/v3_genn.c +1 -6
  392. data/third_party/boringssl/crypto/x509v3/v3_lib.c +1 -0
  393. data/third_party/boringssl/crypto/x509v3/v3_ocsp.c +68 -0
  394. data/third_party/boringssl/crypto/x509v3/v3_pci.c +2 -1
  395. data/third_party/boringssl/crypto/x509v3/v3_purp.c +47 -69
  396. data/third_party/boringssl/crypto/x509v3/v3_skey.c +5 -2
  397. data/third_party/boringssl/crypto/x509v3/v3_utl.c +69 -25
  398. data/third_party/boringssl/include/openssl/aead.h +45 -19
  399. data/third_party/boringssl/include/openssl/aes.h +32 -7
  400. data/third_party/boringssl/include/openssl/asn1.h +7 -77
  401. data/third_party/boringssl/include/openssl/base.h +120 -6
  402. data/third_party/boringssl/include/openssl/base64.h +4 -1
  403. data/third_party/boringssl/include/openssl/bio.h +112 -81
  404. data/third_party/boringssl/include/openssl/blowfish.h +3 -3
  405. data/third_party/boringssl/include/openssl/bn.h +55 -29
  406. data/third_party/boringssl/include/openssl/buf.h +2 -2
  407. data/third_party/boringssl/include/openssl/bytestring.h +54 -32
  408. data/third_party/boringssl/include/openssl/cast.h +2 -2
  409. data/third_party/boringssl/include/openssl/cipher.h +46 -16
  410. data/third_party/boringssl/include/openssl/cmac.h +6 -2
  411. data/third_party/boringssl/include/openssl/conf.h +3 -6
  412. data/third_party/boringssl/include/openssl/cpu.h +25 -9
  413. data/third_party/boringssl/include/openssl/crypto.h +32 -10
  414. data/third_party/boringssl/include/openssl/curve25519.h +4 -4
  415. data/third_party/boringssl/include/openssl/dh.h +3 -2
  416. data/third_party/boringssl/include/openssl/digest.h +21 -7
  417. data/third_party/boringssl/include/openssl/dsa.h +8 -2
  418. data/third_party/boringssl/include/openssl/e_os2.h +18 -0
  419. data/third_party/boringssl/include/openssl/ec.h +25 -21
  420. data/third_party/boringssl/include/openssl/ec_key.h +36 -8
  421. data/third_party/boringssl/include/openssl/ecdh.h +17 -0
  422. data/third_party/boringssl/include/openssl/ecdsa.h +3 -3
  423. data/third_party/boringssl/include/openssl/engine.h +4 -4
  424. data/third_party/boringssl/include/openssl/err.h +3 -0
  425. data/third_party/boringssl/include/openssl/evp.h +199 -42
  426. data/third_party/boringssl/include/openssl/hmac.h +4 -4
  427. data/third_party/boringssl/include/openssl/hrss.h +100 -0
  428. data/third_party/boringssl/include/openssl/lhash.h +131 -23
  429. data/third_party/boringssl/include/openssl/md4.h +6 -4
  430. data/third_party/boringssl/include/openssl/md5.h +6 -4
  431. data/third_party/boringssl/include/openssl/mem.h +6 -2
  432. data/third_party/boringssl/include/openssl/nid.h +3 -0
  433. data/third_party/boringssl/include/openssl/obj.h +3 -0
  434. data/third_party/boringssl/include/openssl/pem.h +102 -64
  435. data/third_party/boringssl/include/openssl/pkcs7.h +136 -3
  436. data/third_party/boringssl/include/openssl/pkcs8.h +42 -3
  437. data/third_party/boringssl/include/openssl/pool.h +13 -2
  438. data/third_party/boringssl/include/openssl/ripemd.h +5 -4
  439. data/third_party/boringssl/include/openssl/rsa.h +46 -15
  440. data/third_party/boringssl/include/openssl/sha.h +40 -28
  441. data/third_party/boringssl/include/openssl/siphash.h +37 -0
  442. data/third_party/boringssl/include/openssl/span.h +17 -9
  443. data/third_party/boringssl/include/openssl/ssl.h +766 -393
  444. data/third_party/boringssl/include/openssl/ssl3.h +4 -3
  445. data/third_party/boringssl/include/openssl/stack.h +134 -77
  446. data/third_party/boringssl/include/openssl/thread.h +1 -1
  447. data/third_party/boringssl/include/openssl/tls1.h +25 -9
  448. data/third_party/boringssl/include/openssl/type_check.h +14 -15
  449. data/third_party/boringssl/include/openssl/x509.h +28 -3
  450. data/third_party/boringssl/include/openssl/x509_vfy.h +98 -32
  451. data/third_party/boringssl/include/openssl/x509v3.h +17 -13
  452. data/third_party/boringssl/ssl/d1_both.cc +9 -18
  453. data/third_party/boringssl/ssl/d1_lib.cc +4 -3
  454. data/third_party/boringssl/ssl/d1_pkt.cc +4 -4
  455. data/third_party/boringssl/ssl/d1_srtp.cc +15 -15
  456. data/third_party/boringssl/ssl/dtls_method.cc +0 -1
  457. data/third_party/boringssl/ssl/dtls_record.cc +28 -28
  458. data/third_party/boringssl/ssl/handoff.cc +295 -91
  459. data/third_party/boringssl/ssl/handshake.cc +133 -72
  460. data/third_party/boringssl/ssl/handshake_client.cc +218 -189
  461. data/third_party/boringssl/ssl/handshake_server.cc +399 -272
  462. data/third_party/boringssl/ssl/internal.h +1413 -928
  463. data/third_party/boringssl/ssl/s3_both.cc +175 -36
  464. data/third_party/boringssl/ssl/s3_lib.cc +9 -13
  465. data/third_party/boringssl/ssl/s3_pkt.cc +63 -29
  466. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +55 -35
  467. data/third_party/boringssl/ssl/ssl_asn1.cc +57 -73
  468. data/third_party/boringssl/ssl/ssl_buffer.cc +13 -12
  469. data/third_party/boringssl/ssl/ssl_cert.cc +313 -210
  470. data/third_party/boringssl/ssl/ssl_cipher.cc +159 -221
  471. data/third_party/boringssl/ssl/ssl_file.cc +2 -0
  472. data/third_party/boringssl/ssl/ssl_key_share.cc +164 -19
  473. data/third_party/boringssl/ssl/ssl_lib.cc +847 -555
  474. data/third_party/boringssl/ssl/ssl_privkey.cc +441 -111
  475. data/third_party/boringssl/ssl/ssl_session.cc +230 -178
  476. data/third_party/boringssl/ssl/ssl_transcript.cc +21 -142
  477. data/third_party/boringssl/ssl/ssl_versions.cc +88 -93
  478. data/third_party/boringssl/ssl/ssl_x509.cc +279 -218
  479. data/third_party/boringssl/ssl/t1_enc.cc +5 -96
  480. data/third_party/boringssl/ssl/t1_lib.cc +931 -678
  481. data/third_party/boringssl/ssl/tls13_both.cc +251 -121
  482. data/third_party/boringssl/ssl/tls13_client.cc +129 -73
  483. data/third_party/boringssl/ssl/tls13_enc.cc +350 -282
  484. data/third_party/boringssl/ssl/tls13_server.cc +259 -192
  485. data/third_party/boringssl/ssl/tls_method.cc +26 -21
  486. data/third_party/boringssl/ssl/tls_record.cc +42 -47
  487. data/third_party/boringssl/third_party/fiat/curve25519.c +261 -1324
  488. data/third_party/boringssl/third_party/fiat/curve25519_32.h +911 -0
  489. data/third_party/boringssl/third_party/fiat/curve25519_64.h +559 -0
  490. data/third_party/boringssl/third_party/fiat/p256.c +238 -999
  491. data/third_party/boringssl/third_party/fiat/p256_32.h +3226 -0
  492. data/third_party/boringssl/third_party/fiat/p256_64.h +1217 -0
  493. data/third_party/upb/upb/port_def.inc +1 -1
  494. data/third_party/upb/upb/table.c +2 -1
  495. metadata +71 -43
  496. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +0 -127
  497. data/src/core/lib/gpr/mpscq.cc +0 -117
  498. data/src/core/lib/gpr/mpscq.h +0 -88
  499. data/src/core/lib/gprpp/abstract.h +0 -47
  500. data/src/core/lib/gprpp/pair.h +0 -38
  501. data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +0 -460
  502. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +0 -256
  503. data/third_party/boringssl/include/openssl/lhash_macros.h +0 -174
  504. data/third_party/boringssl/ssl/custom_extensions.cc +0 -265
@@ -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) */