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
@@ -74,22 +74,18 @@
74
74
 
75
75
 
76
76
  static size_t ec_GFp_simple_point2oct(const EC_GROUP *group,
77
- const EC_POINT *point,
77
+ const EC_RAW_POINT *point,
78
78
  point_conversion_form_t form,
79
- uint8_t *buf, size_t len, BN_CTX *ctx) {
80
- size_t ret = 0;
81
- BN_CTX *new_ctx = NULL;
82
- int used_ctx = 0;
83
-
84
- if ((form != POINT_CONVERSION_COMPRESSED) &&
85
- (form != POINT_CONVERSION_UNCOMPRESSED)) {
79
+ uint8_t *buf, size_t len) {
80
+ if (form != POINT_CONVERSION_COMPRESSED &&
81
+ form != POINT_CONVERSION_UNCOMPRESSED) {
86
82
  OPENSSL_PUT_ERROR(EC, EC_R_INVALID_FORM);
87
- goto err;
83
+ return 0;
88
84
  }
89
85
 
90
- if (EC_POINT_is_at_infinity(group, point)) {
86
+ if (ec_GFp_simple_is_at_infinity(group, point)) {
91
87
  OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY);
92
- goto err;
88
+ return 0;
93
89
  }
94
90
 
95
91
  const size_t field_len = BN_num_bytes(&group->field);
@@ -103,64 +99,31 @@ static size_t ec_GFp_simple_point2oct(const EC_GROUP *group,
103
99
  if (buf != NULL) {
104
100
  if (len < output_len) {
105
101
  OPENSSL_PUT_ERROR(EC, EC_R_BUFFER_TOO_SMALL);
106
- goto err;
107
- }
108
-
109
- if (ctx == NULL) {
110
- ctx = new_ctx = BN_CTX_new();
111
- if (ctx == NULL) {
112
- goto err;
113
- }
102
+ return 0;
114
103
  }
115
104
 
116
- BN_CTX_start(ctx);
117
- used_ctx = 1;
118
- BIGNUM *x = BN_CTX_get(ctx);
119
- BIGNUM *y = BN_CTX_get(ctx);
120
- if (y == NULL) {
121
- goto err;
105
+ uint8_t y_buf[EC_MAX_BYTES];
106
+ size_t field_len_out;
107
+ if (!ec_point_get_affine_coordinate_bytes(
108
+ group, buf + 1 /* x */,
109
+ form == POINT_CONVERSION_COMPRESSED ? y_buf : buf + 1 + field_len,
110
+ &field_len_out, field_len, point)) {
111
+ return 0;
122
112
  }
123
113
 
124
- if (!EC_POINT_get_affine_coordinates_GFp(group, point, x, y, ctx)) {
125
- goto err;
114
+ if (field_len_out != field_len) {
115
+ OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
116
+ return 0;
126
117
  }
127
118
 
128
- if ((form == POINT_CONVERSION_COMPRESSED) &&
129
- BN_is_odd(y)) {
130
- buf[0] = form + 1;
119
+ if (form == POINT_CONVERSION_COMPRESSED) {
120
+ buf[0] = form + (y_buf[field_len - 1] & 1);
131
121
  } else {
132
122
  buf[0] = form;
133
123
  }
134
- size_t i = 1;
135
-
136
- if (!BN_bn2bin_padded(buf + i, field_len, x)) {
137
- OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
138
- goto err;
139
- }
140
- i += field_len;
141
-
142
- if (form == POINT_CONVERSION_UNCOMPRESSED) {
143
- if (!BN_bn2bin_padded(buf + i, field_len, y)) {
144
- OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
145
- goto err;
146
- }
147
- i += field_len;
148
- }
149
-
150
- if (i != output_len) {
151
- OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
152
- goto err;
153
- }
154
124
  }
155
125
 
156
- ret = output_len;
157
-
158
- err:
159
- if (used_ctx) {
160
- BN_CTX_end(ctx);
161
- }
162
- BN_CTX_free(new_ctx);
163
- return ret;
126
+ return output_len;
164
127
  }
165
128
 
166
129
  static int ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
@@ -263,7 +226,7 @@ size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point,
263
226
  OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS);
264
227
  return 0;
265
228
  }
266
- return ec_GFp_simple_point2oct(group, point, form, buf, len, ctx);
229
+ return ec_GFp_simple_point2oct(group, &point->raw, form, buf, len);
267
230
  }
268
231
 
269
232
  int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group,
@@ -203,40 +203,65 @@ static void p224_felem_to_bin28(uint8_t out[28], const p224_felem in) {
203
203
  }
204
204
  }
205
205
 
206
- // To preserve endianness when using BN_bn2bin and BN_bin2bn
207
- static void p224_flip_endian(uint8_t *out, const uint8_t *in, size_t len) {
208
- for (size_t i = 0; i < len; ++i) {
209
- out[i] = in[len - 1 - i];
210
- }
206
+ static void p224_generic_to_felem(p224_felem out, const EC_FELEM *in) {
207
+ p224_bin28_to_felem(out, in->bytes);
211
208
  }
212
209
 
213
- // From OpenSSL BIGNUM to internal representation
214
- static int p224_BN_to_felem(p224_felem out, const BIGNUM *bn) {
215
- // BN_bn2bin eats leading zeroes
216
- p224_felem_bytearray b_out;
217
- OPENSSL_memset(b_out, 0, sizeof(b_out));
218
- size_t num_bytes = BN_num_bytes(bn);
219
- if (num_bytes > sizeof(b_out) ||
220
- BN_is_negative(bn)) {
221
- OPENSSL_PUT_ERROR(EC, EC_R_BIGNUM_OUT_OF_RANGE);
222
- return 0;
223
- }
210
+ // Requires 0 <= in < 2*p (always call p224_felem_reduce first)
211
+ static void p224_felem_to_generic(EC_FELEM *out, const p224_felem in) {
212
+ // Reduce to unique minimal representation.
213
+ static const int64_t two56 = ((p224_limb)1) << 56;
214
+ // 0 <= in < 2*p, p = 2^224 - 2^96 + 1
215
+ // if in > p , reduce in = in - 2^224 + 2^96 - 1
216
+ int64_t tmp[4], a;
217
+ tmp[0] = in[0];
218
+ tmp[1] = in[1];
219
+ tmp[2] = in[2];
220
+ tmp[3] = in[3];
221
+ // Case 1: a = 1 iff in >= 2^224
222
+ a = (in[3] >> 56);
223
+ tmp[0] -= a;
224
+ tmp[1] += a << 40;
225
+ tmp[3] &= 0x00ffffffffffffff;
226
+ // Case 2: a = 0 iff p <= in < 2^224, i.e., the high 128 bits are all 1 and
227
+ // the lower part is non-zero
228
+ a = ((in[3] & in[2] & (in[1] | 0x000000ffffffffff)) + 1) |
229
+ (((int64_t)(in[0] + (in[1] & 0x000000ffffffffff)) - 1) >> 63);
230
+ a &= 0x00ffffffffffffff;
231
+ // turn a into an all-one mask (if a = 0) or an all-zero mask
232
+ a = (a - 1) >> 63;
233
+ // subtract 2^224 - 2^96 + 1 if a is all-one
234
+ tmp[3] &= a ^ 0xffffffffffffffff;
235
+ tmp[2] &= a ^ 0xffffffffffffffff;
236
+ tmp[1] &= (a ^ 0xffffffffffffffff) | 0x000000ffffffffff;
237
+ tmp[0] -= 1 & a;
224
238
 
225
- p224_felem_bytearray b_in;
226
- num_bytes = BN_bn2bin(bn, b_in);
227
- p224_flip_endian(b_out, b_in, num_bytes);
228
- p224_bin28_to_felem(out, b_out);
229
- return 1;
230
- }
239
+ // eliminate negative coefficients: if tmp[0] is negative, tmp[1] must
240
+ // be non-zero, so we only need one step
241
+ a = tmp[0] >> 63;
242
+ tmp[0] += two56 & a;
243
+ tmp[1] -= 1 & a;
231
244
 
232
- // From internal representation to OpenSSL BIGNUM
233
- static BIGNUM *p224_felem_to_BN(BIGNUM *out, const p224_felem in) {
234
- p224_felem_bytearray b_in, b_out;
235
- p224_felem_to_bin28(b_in, in);
236
- p224_flip_endian(b_out, b_in, sizeof(b_out));
237
- return BN_bin2bn(b_out, sizeof(b_out), out);
245
+ // carry 1 -> 2 -> 3
246
+ tmp[2] += tmp[1] >> 56;
247
+ tmp[1] &= 0x00ffffffffffffff;
248
+
249
+ tmp[3] += tmp[2] >> 56;
250
+ tmp[2] &= 0x00ffffffffffffff;
251
+
252
+ // Now 0 <= tmp < p
253
+ p224_felem tmp2;
254
+ tmp2[0] = tmp[0];
255
+ tmp2[1] = tmp[1];
256
+ tmp2[2] = tmp[2];
257
+ tmp2[3] = tmp[3];
258
+
259
+ p224_felem_to_bin28(out->bytes, tmp2);
260
+ // 224 is not a multiple of 64, so zero the remaining bytes.
261
+ OPENSSL_memset(out->bytes + 28, 0, 32 - 28);
238
262
  }
239
263
 
264
+
240
265
  // Field operations, using the internal representation of field elements.
241
266
  // NB! These operations are specific to our point multiplication and cannot be
242
267
  // expected to be correct in general - e.g., multiplication with a large scalar
@@ -447,55 +472,6 @@ static void p224_felem_reduce(p224_felem out, const p224_widefelem in) {
447
472
  out[3] = output[3];
448
473
  }
449
474
 
450
- // Reduce to unique minimal representation.
451
- // Requires 0 <= in < 2*p (always call p224_felem_reduce first)
452
- static void p224_felem_contract(p224_felem out, const p224_felem in) {
453
- static const int64_t two56 = ((p224_limb)1) << 56;
454
- // 0 <= in < 2*p, p = 2^224 - 2^96 + 1
455
- // if in > p , reduce in = in - 2^224 + 2^96 - 1
456
- int64_t tmp[4], a;
457
- tmp[0] = in[0];
458
- tmp[1] = in[1];
459
- tmp[2] = in[2];
460
- tmp[3] = in[3];
461
- // Case 1: a = 1 iff in >= 2^224
462
- a = (in[3] >> 56);
463
- tmp[0] -= a;
464
- tmp[1] += a << 40;
465
- tmp[3] &= 0x00ffffffffffffff;
466
- // Case 2: a = 0 iff p <= in < 2^224, i.e., the high 128 bits are all 1 and
467
- // the lower part is non-zero
468
- a = ((in[3] & in[2] & (in[1] | 0x000000ffffffffff)) + 1) |
469
- (((int64_t)(in[0] + (in[1] & 0x000000ffffffffff)) - 1) >> 63);
470
- a &= 0x00ffffffffffffff;
471
- // turn a into an all-one mask (if a = 0) or an all-zero mask
472
- a = (a - 1) >> 63;
473
- // subtract 2^224 - 2^96 + 1 if a is all-one
474
- tmp[3] &= a ^ 0xffffffffffffffff;
475
- tmp[2] &= a ^ 0xffffffffffffffff;
476
- tmp[1] &= (a ^ 0xffffffffffffffff) | 0x000000ffffffffff;
477
- tmp[0] -= 1 & a;
478
-
479
- // eliminate negative coefficients: if tmp[0] is negative, tmp[1] must
480
- // be non-zero, so we only need one step
481
- a = tmp[0] >> 63;
482
- tmp[0] += two56 & a;
483
- tmp[1] -= 1 & a;
484
-
485
- // carry 1 -> 2 -> 3
486
- tmp[2] += tmp[1] >> 56;
487
- tmp[1] &= 0x00ffffffffffffff;
488
-
489
- tmp[3] += tmp[2] >> 56;
490
- tmp[2] &= 0x00ffffffffffffff;
491
-
492
- // Now 0 <= out < p
493
- out[0] = tmp[0];
494
- out[1] = tmp[1];
495
- out[2] = tmp[2];
496
- out[3] = tmp[3];
497
- }
498
-
499
475
  // Get negative value: out = -in
500
476
  // Requires in[i] < 2^63,
501
477
  // ensures out[0] < 2^56, out[1] < 2^56, out[2] < 2^56, out[3] <= 2^56 + 2^16
@@ -782,7 +758,9 @@ static void p224_point_add(p224_felem x3, p224_felem y3, p224_felem z3,
782
758
  z1_is_zero = p224_felem_is_zero(z1);
783
759
  z2_is_zero = p224_felem_is_zero(z2);
784
760
  // In affine coordinates, (X_1, Y_1) == (X_2, Y_2)
785
- if (x_equal && y_equal && !z1_is_zero && !z2_is_zero) {
761
+ p224_limb is_nontrivial_double =
762
+ x_equal & y_equal & (1 - z1_is_zero) & (1 - z2_is_zero);
763
+ if (is_nontrivial_double) {
786
764
  p224_point_double(x3, y3, z3, x1, y1, z1);
787
765
  return;
788
766
  }
@@ -895,196 +873,295 @@ static char p224_get_bit(const p224_felem_bytearray in, size_t i) {
895
873
  return (in[i >> 3] >> (i & 7)) & 1;
896
874
  }
897
875
 
898
- // Interleaved point multiplication using precomputed point multiples:
899
- // The small point multiples 0*P, 1*P, ..., 16*P are in p_pre_comp, the scalars
900
- // in p_scalar, if non-NULL. If g_scalar is non-NULL, we also add this multiple
901
- // of the generator, using certain (large) precomputed multiples in
902
- // g_p224_pre_comp. Output point (X, Y, Z) is stored in x_out, y_out, z_out
903
- static void p224_batch_mul(p224_felem x_out, p224_felem y_out, p224_felem z_out,
904
- const uint8_t *p_scalar, const uint8_t *g_scalar,
905
- const p224_felem p_pre_comp[17][3]) {
906
- p224_felem nq[3], tmp[4];
907
- uint64_t bits;
908
- uint8_t sign, digit;
876
+ // Takes the Jacobian coordinates (X, Y, Z) of a point and returns
877
+ // (X', Y') = (X/Z^2, Y/Z^3)
878
+ static int ec_GFp_nistp224_point_get_affine_coordinates(
879
+ const EC_GROUP *group, const EC_RAW_POINT *point, EC_FELEM *x,
880
+ EC_FELEM *y) {
881
+ if (ec_GFp_simple_is_at_infinity(group, point)) {
882
+ OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY);
883
+ return 0;
884
+ }
909
885
 
910
- // set nq to the point at infinity
911
- OPENSSL_memset(nq, 0, 3 * sizeof(p224_felem));
886
+ p224_felem z1, z2;
887
+ p224_widefelem tmp;
888
+ p224_generic_to_felem(z1, &point->Z);
889
+ p224_felem_inv(z2, z1);
890
+ p224_felem_square(tmp, z2);
891
+ p224_felem_reduce(z1, tmp);
912
892
 
913
- // Loop over both scalars msb-to-lsb, interleaving additions of multiples of
914
- // the generator (two in each of the last 28 rounds) and additions of p (every
915
- // 5th round).
916
- int skip = 1; // save two point operations in the first round
917
- size_t i = p_scalar != NULL ? 220 : 27;
918
- for (;;) {
919
- // double
920
- if (!skip) {
921
- p224_point_double(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2]);
893
+ if (x != NULL) {
894
+ p224_felem x_in, x_out;
895
+ p224_generic_to_felem(x_in, &point->X);
896
+ p224_felem_mul(tmp, x_in, z1);
897
+ p224_felem_reduce(x_out, tmp);
898
+ p224_felem_to_generic(x, x_out);
899
+ }
900
+
901
+ if (y != NULL) {
902
+ p224_felem y_in, y_out;
903
+ p224_generic_to_felem(y_in, &point->Y);
904
+ p224_felem_mul(tmp, z1, z2);
905
+ p224_felem_reduce(z1, tmp);
906
+ p224_felem_mul(tmp, y_in, z1);
907
+ p224_felem_reduce(y_out, tmp);
908
+ p224_felem_to_generic(y, y_out);
909
+ }
910
+
911
+ return 1;
912
+ }
913
+
914
+ static void ec_GFp_nistp224_add(const EC_GROUP *group, EC_RAW_POINT *r,
915
+ const EC_RAW_POINT *a, const EC_RAW_POINT *b) {
916
+ p224_felem x1, y1, z1, x2, y2, z2;
917
+ p224_generic_to_felem(x1, &a->X);
918
+ p224_generic_to_felem(y1, &a->Y);
919
+ p224_generic_to_felem(z1, &a->Z);
920
+ p224_generic_to_felem(x2, &b->X);
921
+ p224_generic_to_felem(y2, &b->Y);
922
+ p224_generic_to_felem(z2, &b->Z);
923
+ p224_point_add(x1, y1, z1, x1, y1, z1, 0 /* both Jacobian */, x2, y2, z2);
924
+ // The outputs are already reduced, but still need to be contracted.
925
+ p224_felem_to_generic(&r->X, x1);
926
+ p224_felem_to_generic(&r->Y, y1);
927
+ p224_felem_to_generic(&r->Z, z1);
928
+ }
929
+
930
+ static void ec_GFp_nistp224_dbl(const EC_GROUP *group, EC_RAW_POINT *r,
931
+ const EC_RAW_POINT *a) {
932
+ p224_felem x, y, z;
933
+ p224_generic_to_felem(x, &a->X);
934
+ p224_generic_to_felem(y, &a->Y);
935
+ p224_generic_to_felem(z, &a->Z);
936
+ p224_point_double(x, y, z, x, y, z);
937
+ // The outputs are already reduced, but still need to be contracted.
938
+ p224_felem_to_generic(&r->X, x);
939
+ p224_felem_to_generic(&r->Y, y);
940
+ p224_felem_to_generic(&r->Z, z);
941
+ }
942
+
943
+ static void ec_GFp_nistp224_make_precomp(p224_felem out[17][3],
944
+ const EC_RAW_POINT *p) {
945
+ OPENSSL_memset(out[0], 0, sizeof(p224_felem) * 3);
946
+
947
+ p224_generic_to_felem(out[1][0], &p->X);
948
+ p224_generic_to_felem(out[1][1], &p->Y);
949
+ p224_generic_to_felem(out[1][2], &p->Z);
950
+
951
+ for (size_t j = 2; j <= 16; ++j) {
952
+ if (j & 1) {
953
+ p224_point_add(out[j][0], out[j][1], out[j][2], out[1][0], out[1][1],
954
+ out[1][2], 0, out[j - 1][0], out[j - 1][1], out[j - 1][2]);
955
+ } else {
956
+ p224_point_double(out[j][0], out[j][1], out[j][2], out[j / 2][0],
957
+ out[j / 2][1], out[j / 2][2]);
922
958
  }
959
+ }
960
+ }
923
961
 
924
- // add multiples of the generator
925
- if (g_scalar != NULL && i <= 27) {
926
- // first, look 28 bits upwards
927
- bits = p224_get_bit(g_scalar, i + 196) << 3;
928
- bits |= p224_get_bit(g_scalar, i + 140) << 2;
929
- bits |= p224_get_bit(g_scalar, i + 84) << 1;
930
- bits |= p224_get_bit(g_scalar, i + 28);
931
- // select the point to add, in constant time
932
- p224_select_point(bits, 16, g_p224_pre_comp[1], tmp);
962
+ static void ec_GFp_nistp224_point_mul(const EC_GROUP *group, EC_RAW_POINT *r,
963
+ const EC_RAW_POINT *p,
964
+ const EC_SCALAR *scalar) {
965
+ p224_felem p_pre_comp[17][3];
966
+ ec_GFp_nistp224_make_precomp(p_pre_comp, p);
933
967
 
934
- if (!skip) {
935
- p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */,
936
- tmp[0], tmp[1], tmp[2]);
937
- } else {
938
- OPENSSL_memcpy(nq, tmp, 3 * sizeof(p224_felem));
939
- skip = 0;
940
- }
968
+ // Set nq to the point at infinity.
969
+ p224_felem nq[3], tmp[4];
970
+ OPENSSL_memset(nq, 0, 3 * sizeof(p224_felem));
941
971
 
942
- // second, look at the current position
943
- bits = p224_get_bit(g_scalar, i + 168) << 3;
944
- bits |= p224_get_bit(g_scalar, i + 112) << 2;
945
- bits |= p224_get_bit(g_scalar, i + 56) << 1;
946
- bits |= p224_get_bit(g_scalar, i);
947
- // select the point to add, in constant time
948
- p224_select_point(bits, 16, g_p224_pre_comp[0], tmp);
949
- p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */,
950
- tmp[0], tmp[1], tmp[2]);
972
+ int skip = 1; // Save two point operations in the first round.
973
+ for (size_t i = 220; i < 221; i--) {
974
+ if (!skip) {
975
+ p224_point_double(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2]);
951
976
  }
952
977
 
953
- // do other additions every 5 doublings
954
- if (p_scalar != NULL && i % 5 == 0) {
955
- bits = p224_get_bit(p_scalar, i + 4) << 5;
956
- bits |= p224_get_bit(p_scalar, i + 3) << 4;
957
- bits |= p224_get_bit(p_scalar, i + 2) << 3;
958
- bits |= p224_get_bit(p_scalar, i + 1) << 2;
959
- bits |= p224_get_bit(p_scalar, i) << 1;
960
- bits |= p224_get_bit(p_scalar, i - 1);
978
+ // Add every 5 doublings.
979
+ if (i % 5 == 0) {
980
+ uint64_t bits = p224_get_bit(scalar->bytes, i + 4) << 5;
981
+ bits |= p224_get_bit(scalar->bytes, i + 3) << 4;
982
+ bits |= p224_get_bit(scalar->bytes, i + 2) << 3;
983
+ bits |= p224_get_bit(scalar->bytes, i + 1) << 2;
984
+ bits |= p224_get_bit(scalar->bytes, i) << 1;
985
+ bits |= p224_get_bit(scalar->bytes, i - 1);
986
+ uint8_t sign, digit;
961
987
  ec_GFp_nistp_recode_scalar_bits(&sign, &digit, bits);
962
988
 
963
- // select the point to add or subtract
964
- p224_select_point(digit, 17, p_pre_comp, tmp);
989
+ // Select the point to add or subtract.
990
+ p224_select_point(digit, 17, (const p224_felem(*)[3])p_pre_comp, tmp);
965
991
  p224_felem_neg(tmp[3], tmp[1]); // (X, -Y, Z) is the negative point
966
992
  p224_copy_conditional(tmp[1], tmp[3], sign);
967
993
 
968
994
  if (!skip) {
969
995
  p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 0 /* mixed */,
970
- tmp[0], tmp[1], tmp[2]);
996
+ tmp[0], tmp[1], tmp[2]);
971
997
  } else {
972
998
  OPENSSL_memcpy(nq, tmp, 3 * sizeof(p224_felem));
973
999
  skip = 0;
974
1000
  }
975
1001
  }
976
-
977
- if (i == 0) {
978
- break;
979
- }
980
- --i;
981
1002
  }
982
- p224_felem_assign(x_out, nq[0]);
983
- p224_felem_assign(y_out, nq[1]);
984
- p224_felem_assign(z_out, nq[2]);
985
- }
986
1003
 
987
- // Takes the Jacobian coordinates (X, Y, Z) of a point and returns
988
- // (X', Y') = (X/Z^2, Y/Z^3)
989
- static int ec_GFp_nistp224_point_get_affine_coordinates(const EC_GROUP *group,
990
- const EC_POINT *point,
991
- BIGNUM *x, BIGNUM *y,
992
- BN_CTX *ctx) {
993
- p224_felem z1, z2, x_in, y_in, x_out, y_out;
994
- p224_widefelem tmp;
1004
+ // Reduce the output to its unique minimal representation.
1005
+ p224_felem_to_generic(&r->X, nq[0]);
1006
+ p224_felem_to_generic(&r->Y, nq[1]);
1007
+ p224_felem_to_generic(&r->Z, nq[2]);
1008
+ }
995
1009
 
996
- if (EC_POINT_is_at_infinity(group, point)) {
997
- OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY);
998
- return 0;
999
- }
1010
+ static void ec_GFp_nistp224_point_mul_base(const EC_GROUP *group,
1011
+ EC_RAW_POINT *r,
1012
+ const EC_SCALAR *scalar) {
1013
+ // Set nq to the point at infinity.
1014
+ p224_felem nq[3], tmp[3];
1015
+ OPENSSL_memset(nq, 0, 3 * sizeof(p224_felem));
1000
1016
 
1001
- if (!p224_BN_to_felem(x_in, &point->X) ||
1002
- !p224_BN_to_felem(y_in, &point->Y) ||
1003
- !p224_BN_to_felem(z1, &point->Z)) {
1004
- return 0;
1005
- }
1017
+ int skip = 1; // Save two point operations in the first round.
1018
+ for (size_t i = 27; i < 28; i--) {
1019
+ // double
1020
+ if (!skip) {
1021
+ p224_point_double(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2]);
1022
+ }
1006
1023
 
1007
- p224_felem_inv(z2, z1);
1008
- p224_felem_square(tmp, z2);
1009
- p224_felem_reduce(z1, tmp);
1024
+ // First, look 28 bits upwards.
1025
+ uint64_t bits = p224_get_bit(scalar->bytes, i + 196) << 3;
1026
+ bits |= p224_get_bit(scalar->bytes, i + 140) << 2;
1027
+ bits |= p224_get_bit(scalar->bytes, i + 84) << 1;
1028
+ bits |= p224_get_bit(scalar->bytes, i + 28);
1029
+ // Select the point to add, in constant time.
1030
+ p224_select_point(bits, 16, g_p224_pre_comp[1], tmp);
1010
1031
 
1011
- if (x != NULL) {
1012
- p224_felem_mul(tmp, x_in, z1);
1013
- p224_felem_reduce(x_in, tmp);
1014
- p224_felem_contract(x_out, x_in);
1015
- if (!p224_felem_to_BN(x, x_out)) {
1016
- OPENSSL_PUT_ERROR(EC, ERR_R_BN_LIB);
1017
- return 0;
1032
+ if (!skip) {
1033
+ p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */,
1034
+ tmp[0], tmp[1], tmp[2]);
1035
+ } else {
1036
+ OPENSSL_memcpy(nq, tmp, 3 * sizeof(p224_felem));
1037
+ skip = 0;
1018
1038
  }
1019
- }
1020
1039
 
1021
- if (y != NULL) {
1022
- p224_felem_mul(tmp, z1, z2);
1023
- p224_felem_reduce(z1, tmp);
1024
- p224_felem_mul(tmp, y_in, z1);
1025
- p224_felem_reduce(y_in, tmp);
1026
- p224_felem_contract(y_out, y_in);
1027
- if (!p224_felem_to_BN(y, y_out)) {
1028
- OPENSSL_PUT_ERROR(EC, ERR_R_BN_LIB);
1029
- return 0;
1030
- }
1040
+ // Second, look at the current position/
1041
+ bits = p224_get_bit(scalar->bytes, i + 168) << 3;
1042
+ bits |= p224_get_bit(scalar->bytes, i + 112) << 2;
1043
+ bits |= p224_get_bit(scalar->bytes, i + 56) << 1;
1044
+ bits |= p224_get_bit(scalar->bytes, i);
1045
+ // Select the point to add, in constant time.
1046
+ p224_select_point(bits, 16, g_p224_pre_comp[0], tmp);
1047
+ p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */,
1048
+ tmp[0], tmp[1], tmp[2]);
1031
1049
  }
1032
1050
 
1033
- return 1;
1051
+ // Reduce the output to its unique minimal representation.
1052
+ p224_felem_to_generic(&r->X, nq[0]);
1053
+ p224_felem_to_generic(&r->Y, nq[1]);
1054
+ p224_felem_to_generic(&r->Z, nq[2]);
1034
1055
  }
1035
1056
 
1036
- static int ec_GFp_nistp224_points_mul(const EC_GROUP *group, EC_POINT *r,
1037
- const EC_SCALAR *g_scalar,
1038
- const EC_POINT *p,
1039
- const EC_SCALAR *p_scalar, BN_CTX *ctx) {
1057
+ static void ec_GFp_nistp224_point_mul_public(const EC_GROUP *group,
1058
+ EC_RAW_POINT *r,
1059
+ const EC_SCALAR *g_scalar,
1060
+ const EC_RAW_POINT *p,
1061
+ const EC_SCALAR *p_scalar) {
1062
+ // TODO(davidben): If P-224 ECDSA verify performance ever matters, using
1063
+ // |ec_compute_wNAF| for |p_scalar| would likely be an easy improvement.
1040
1064
  p224_felem p_pre_comp[17][3];
1041
- p224_felem x_in, y_in, z_in, x_out, y_out, z_out;
1042
-
1043
- if (p != NULL && p_scalar != NULL) {
1044
- // We treat NULL scalars as 0, and NULL points as points at infinity, i.e.,
1045
- // they contribute nothing to the linear combination.
1046
- OPENSSL_memset(&p_pre_comp, 0, sizeof(p_pre_comp));
1047
- // precompute multiples
1048
- if (!p224_BN_to_felem(x_out, &p->X) ||
1049
- !p224_BN_to_felem(y_out, &p->Y) ||
1050
- !p224_BN_to_felem(z_out, &p->Z)) {
1051
- return 0;
1065
+ ec_GFp_nistp224_make_precomp(p_pre_comp, p);
1066
+
1067
+ // Set nq to the point at infinity.
1068
+ p224_felem nq[3], tmp[3];
1069
+ OPENSSL_memset(nq, 0, 3 * sizeof(p224_felem));
1070
+
1071
+ // Loop over both scalars msb-to-lsb, interleaving additions of multiples of
1072
+ // the generator (two in each of the last 28 rounds) and additions of p (every
1073
+ // 5th round).
1074
+ int skip = 1; // Save two point operations in the first round.
1075
+ for (size_t i = 220; i < 221; i--) {
1076
+ if (!skip) {
1077
+ p224_point_double(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2]);
1052
1078
  }
1053
1079
 
1054
- p224_felem_assign(p_pre_comp[1][0], x_out);
1055
- p224_felem_assign(p_pre_comp[1][1], y_out);
1056
- p224_felem_assign(p_pre_comp[1][2], z_out);
1080
+ // Add multiples of the generator.
1081
+ if (i <= 27) {
1082
+ // First, look 28 bits upwards.
1083
+ uint64_t bits = p224_get_bit(g_scalar->bytes, i + 196) << 3;
1084
+ bits |= p224_get_bit(g_scalar->bytes, i + 140) << 2;
1085
+ bits |= p224_get_bit(g_scalar->bytes, i + 84) << 1;
1086
+ bits |= p224_get_bit(g_scalar->bytes, i + 28);
1057
1087
 
1058
- for (size_t j = 2; j <= 16; ++j) {
1059
- if (j & 1) {
1060
- p224_point_add(p_pre_comp[j][0], p_pre_comp[j][1], p_pre_comp[j][2],
1061
- p_pre_comp[1][0], p_pre_comp[1][1], p_pre_comp[1][2],
1062
- 0, p_pre_comp[j - 1][0], p_pre_comp[j - 1][1],
1063
- p_pre_comp[j - 1][2]);
1088
+ p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */,
1089
+ g_p224_pre_comp[1][bits][0], g_p224_pre_comp[1][bits][1],
1090
+ g_p224_pre_comp[1][bits][2]);
1091
+ assert(!skip);
1092
+
1093
+ // Second, look at the current position.
1094
+ bits = p224_get_bit(g_scalar->bytes, i + 168) << 3;
1095
+ bits |= p224_get_bit(g_scalar->bytes, i + 112) << 2;
1096
+ bits |= p224_get_bit(g_scalar->bytes, i + 56) << 1;
1097
+ bits |= p224_get_bit(g_scalar->bytes, i);
1098
+ p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */,
1099
+ g_p224_pre_comp[0][bits][0], g_p224_pre_comp[0][bits][1],
1100
+ g_p224_pre_comp[0][bits][2]);
1101
+ }
1102
+
1103
+ // Incorporate |p_scalar| every 5 doublings.
1104
+ if (i % 5 == 0) {
1105
+ uint64_t bits = p224_get_bit(p_scalar->bytes, i + 4) << 5;
1106
+ bits |= p224_get_bit(p_scalar->bytes, i + 3) << 4;
1107
+ bits |= p224_get_bit(p_scalar->bytes, i + 2) << 3;
1108
+ bits |= p224_get_bit(p_scalar->bytes, i + 1) << 2;
1109
+ bits |= p224_get_bit(p_scalar->bytes, i) << 1;
1110
+ bits |= p224_get_bit(p_scalar->bytes, i - 1);
1111
+ uint8_t sign, digit;
1112
+ ec_GFp_nistp_recode_scalar_bits(&sign, &digit, bits);
1113
+
1114
+ // Select the point to add or subtract.
1115
+ OPENSSL_memcpy(tmp, p_pre_comp[digit], 3 * sizeof(p224_felem));
1116
+ if (sign) {
1117
+ p224_felem_neg(tmp[1], tmp[1]); // (X, -Y, Z) is the negative point
1118
+ }
1119
+
1120
+ if (!skip) {
1121
+ p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 0 /* mixed */,
1122
+ tmp[0], tmp[1], tmp[2]);
1064
1123
  } else {
1065
- p224_point_double(p_pre_comp[j][0], p_pre_comp[j][1],
1066
- p_pre_comp[j][2], p_pre_comp[j / 2][0],
1067
- p_pre_comp[j / 2][1], p_pre_comp[j / 2][2]);
1124
+ OPENSSL_memcpy(nq, tmp, 3 * sizeof(p224_felem));
1125
+ skip = 0;
1068
1126
  }
1069
1127
  }
1070
1128
  }
1071
1129
 
1072
- p224_batch_mul(x_out, y_out, z_out,
1073
- (p != NULL && p_scalar != NULL) ? p_scalar->bytes : NULL,
1074
- g_scalar != NULL ? g_scalar->bytes : NULL,
1075
- (const p224_felem(*)[3])p_pre_comp);
1076
-
1077
- // reduce the output to its unique minimal representation
1078
- p224_felem_contract(x_in, x_out);
1079
- p224_felem_contract(y_in, y_out);
1080
- p224_felem_contract(z_in, z_out);
1081
- if (!p224_felem_to_BN(&r->X, x_in) ||
1082
- !p224_felem_to_BN(&r->Y, y_in) ||
1083
- !p224_felem_to_BN(&r->Z, z_in)) {
1084
- OPENSSL_PUT_ERROR(EC, ERR_R_BN_LIB);
1085
- return 0;
1086
- }
1087
- return 1;
1130
+ // Reduce the output to its unique minimal representation.
1131
+ p224_felem_to_generic(&r->X, nq[0]);
1132
+ p224_felem_to_generic(&r->Y, nq[1]);
1133
+ p224_felem_to_generic(&r->Z, nq[2]);
1134
+ }
1135
+
1136
+ static void ec_GFp_nistp224_felem_mul(const EC_GROUP *group, EC_FELEM *r,
1137
+ const EC_FELEM *a, const EC_FELEM *b) {
1138
+ p224_felem felem1, felem2;
1139
+ p224_widefelem wide;
1140
+ p224_generic_to_felem(felem1, a);
1141
+ p224_generic_to_felem(felem2, b);
1142
+ p224_felem_mul(wide, felem1, felem2);
1143
+ p224_felem_reduce(felem1, wide);
1144
+ p224_felem_to_generic(r, felem1);
1145
+ }
1146
+
1147
+ static void ec_GFp_nistp224_felem_sqr(const EC_GROUP *group, EC_FELEM *r,
1148
+ const EC_FELEM *a) {
1149
+ p224_felem felem;
1150
+ p224_generic_to_felem(felem, a);
1151
+ p224_widefelem wide;
1152
+ p224_felem_square(wide, felem);
1153
+ p224_felem_reduce(felem, wide);
1154
+ p224_felem_to_generic(r, felem);
1155
+ }
1156
+
1157
+ static int ec_GFp_nistp224_bignum_to_felem(const EC_GROUP *group, EC_FELEM *out,
1158
+ const BIGNUM *in) {
1159
+ return bn_copy_words(out->words, group->field.width, in);
1160
+ }
1161
+
1162
+ static int ec_GFp_nistp224_felem_to_bignum(const EC_GROUP *group, BIGNUM *out,
1163
+ const EC_FELEM *in) {
1164
+ return bn_set_words(out, in->words, group->field.width);
1088
1165
  }
1089
1166
 
1090
1167
  DEFINE_METHOD_FUNCTION(EC_METHOD, EC_GFp_nistp224_method) {
@@ -1093,12 +1170,18 @@ DEFINE_METHOD_FUNCTION(EC_METHOD, EC_GFp_nistp224_method) {
1093
1170
  out->group_set_curve = ec_GFp_simple_group_set_curve;
1094
1171
  out->point_get_affine_coordinates =
1095
1172
  ec_GFp_nistp224_point_get_affine_coordinates;
1096
- out->mul = ec_GFp_nistp224_points_mul;
1097
- out->mul_public = ec_GFp_nistp224_points_mul;
1098
- out->field_mul = ec_GFp_simple_field_mul;
1099
- out->field_sqr = ec_GFp_simple_field_sqr;
1100
- out->field_encode = NULL;
1101
- out->field_decode = NULL;
1102
- };
1173
+ out->add = ec_GFp_nistp224_add;
1174
+ out->dbl = ec_GFp_nistp224_dbl;
1175
+ out->mul = ec_GFp_nistp224_point_mul;
1176
+ out->mul_base = ec_GFp_nistp224_point_mul_base;
1177
+ out->mul_public = ec_GFp_nistp224_point_mul_public;
1178
+ out->felem_mul = ec_GFp_nistp224_felem_mul;
1179
+ out->felem_sqr = ec_GFp_nistp224_felem_sqr;
1180
+ out->bignum_to_felem = ec_GFp_nistp224_bignum_to_felem;
1181
+ out->felem_to_bignum = ec_GFp_nistp224_felem_to_bignum;
1182
+ out->scalar_inv_montgomery = ec_simple_scalar_inv_montgomery;
1183
+ out->scalar_inv_montgomery_vartime = ec_GFp_simple_mont_inv_mod_ord_vartime;
1184
+ out->cmp_x_coordinate = ec_GFp_simple_cmp_x_coordinate;
1185
+ }
1103
1186
 
1104
1187
  #endif // BORINGSSL_HAS_UINT128 && !SMALL