grpc-flamingo 1.11.0 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (452) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1150 -176
  3. data/etc/roots.pem +40 -196
  4. data/include/grpc/grpc.h +49 -8
  5. data/include/grpc/grpc_security.h +123 -2
  6. data/include/grpc/grpc_security_constants.h +6 -0
  7. data/include/grpc/impl/codegen/fork.h +4 -4
  8. data/include/grpc/impl/codegen/grpc_types.h +26 -5
  9. data/include/grpc/impl/codegen/log.h +112 -0
  10. data/include/grpc/impl/codegen/port_platform.h +55 -4
  11. data/include/grpc/module.modulemap +2 -0
  12. data/include/grpc/support/log.h +2 -80
  13. data/include/grpc/support/string_util.h +2 -0
  14. data/include/grpc/support/sync.h +0 -16
  15. data/src/boringssl/err_data.c +602 -588
  16. data/src/core/ext/{census → filters/census}/grpc_context.cc +0 -0
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +1234 -1070
  19. data/src/core/ext/filters/client_channel/client_channel.h +5 -0
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +113 -0
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +71 -0
  22. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -0
  23. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  24. data/src/core/ext/filters/client_channel/http_proxy.cc +22 -5
  25. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy.h +30 -10
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -9
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +120 -127
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +36 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +36 -102
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +37 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +25 -22
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +4 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +19 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +54 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +19 -0
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +54 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +4 -17
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +37 -63
  40. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +306 -239
  41. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +444 -392
  42. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +538 -98
  43. data/src/core/ext/filters/client_channel/lb_policy_factory.cc +8 -0
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +4 -0
  45. data/src/core/ext/filters/client_channel/method_params.h +4 -0
  46. data/src/core/ext/filters/client_channel/resolver.h +10 -0
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -19
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +320 -0
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +62 -9
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +49 -294
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +537 -0
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +112 -87
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +17 -2
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +6 -5
  55. data/src/core/ext/filters/{load_reporting/server_load_reporting_filter.h → client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc} +7 -8
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +29 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +32 -15
  58. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -0
  59. data/src/core/ext/filters/client_channel/subchannel.cc +58 -15
  60. data/src/core/ext/filters/client_channel/subchannel.h +11 -0
  61. data/src/core/ext/filters/deadline/deadline_filter.cc +18 -15
  62. data/src/core/ext/filters/deadline/deadline_filter.h +5 -5
  63. data/src/core/ext/filters/http/client/http_client_filter.cc +10 -9
  64. data/src/core/ext/filters/http/client_authority_filter.cc +6 -5
  65. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +6 -6
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +123 -131
  67. data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
  68. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  69. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
  70. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -2
  71. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +9 -8
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +97 -48
  73. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -7
  74. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +3 -3
  75. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +12 -8
  76. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -3
  77. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -2
  78. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +2 -2
  79. data/src/core/ext/transport/chttp2/transport/parsing.cc +14 -12
  80. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  81. data/src/core/ext/transport/chttp2/transport/writing.cc +32 -27
  82. data/src/core/ext/transport/inproc/inproc_transport.cc +87 -49
  83. data/src/core/lib/channel/channel_args.cc +28 -0
  84. data/src/core/lib/channel/channel_args.h +4 -0
  85. data/src/core/lib/channel/channel_stack.cc +22 -29
  86. data/src/core/lib/channel/channel_stack.h +2 -2
  87. data/src/core/lib/channel/channel_stack_builder.cc +0 -3
  88. data/src/core/lib/channel/channel_stack_builder.h +0 -2
  89. data/src/core/lib/channel/channel_trace.cc +28 -63
  90. data/src/core/lib/channel/channel_trace.h +13 -17
  91. data/src/core/lib/channel/channelz.cc +153 -0
  92. data/src/core/lib/channel/channelz.h +133 -0
  93. data/src/core/lib/channel/channelz_registry.cc +145 -0
  94. data/src/core/lib/channel/channelz_registry.h +120 -0
  95. data/src/core/lib/channel/connected_channel.cc +8 -1
  96. data/src/core/lib/channel/handshaker.cc +71 -0
  97. data/src/core/lib/channel/handshaker.h +4 -0
  98. data/src/core/lib/debug/stats.h +7 -0
  99. data/src/core/lib/debug/stats_data.cc +5 -0
  100. data/src/core/lib/debug/stats_data.h +120 -0
  101. data/src/core/lib/debug/trace.cc +2 -1
  102. data/src/core/lib/debug/trace.h +12 -1
  103. data/src/core/lib/gpr/alloc.h +28 -0
  104. data/src/core/lib/gpr/arena.cc +38 -45
  105. data/src/core/lib/gpr/log.cc +8 -2
  106. data/src/core/lib/gpr/log_android.cc +4 -0
  107. data/src/core/lib/gpr/log_linux.cc +4 -0
  108. data/src/core/lib/gpr/log_posix.cc +4 -0
  109. data/src/core/lib/gpr/log_windows.cc +5 -0
  110. data/src/core/lib/gpr/string.cc +28 -0
  111. data/src/core/lib/gpr/string.h +10 -0
  112. data/src/core/lib/gprpp/abstract.h +5 -2
  113. data/src/core/lib/gprpp/fork.cc +268 -0
  114. data/src/core/lib/gprpp/fork.h +88 -0
  115. data/src/core/lib/gprpp/inlined_vector.h +87 -37
  116. data/src/core/lib/gprpp/memory.h +12 -0
  117. data/src/core/lib/gprpp/mutex_lock.h +42 -0
  118. data/src/core/lib/gprpp/orphanable.h +10 -12
  119. data/src/core/lib/gprpp/ref_counted.h +10 -12
  120. data/src/core/lib/gprpp/ref_counted_ptr.h +65 -8
  121. data/src/core/lib/gprpp/thd.h +0 -3
  122. data/src/core/lib/gprpp/thd_posix.cc +5 -54
  123. data/src/core/lib/gprpp/thd_windows.cc +0 -7
  124. data/src/core/lib/http/httpcli_security_connector.cc +1 -3
  125. data/src/core/lib/iomgr/call_combiner.cc +13 -13
  126. data/src/core/lib/iomgr/call_combiner.h +84 -1
  127. data/src/core/lib/iomgr/closure.h +6 -5
  128. data/src/core/lib/iomgr/combiner.cc +30 -13
  129. data/src/core/lib/iomgr/combiner.h +1 -1
  130. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  131. data/src/core/lib/iomgr/error.cc +12 -0
  132. data/src/core/lib/iomgr/error.h +5 -0
  133. data/src/core/lib/iomgr/ev_epoll1_linux.cc +138 -51
  134. data/src/core/lib/iomgr/ev_epollex_linux.cc +276 -93
  135. data/src/core/lib/iomgr/ev_epollsig_linux.cc +58 -50
  136. data/src/core/lib/iomgr/ev_poll_posix.cc +163 -42
  137. data/src/core/lib/iomgr/ev_posix.cc +88 -24
  138. data/src/core/lib/iomgr/ev_posix.h +48 -12
  139. data/src/core/lib/iomgr/exec_ctx.cc +15 -9
  140. data/src/core/lib/iomgr/exec_ctx.h +48 -20
  141. data/src/core/lib/iomgr/executor.cc +274 -142
  142. data/src/core/lib/iomgr/executor.h +82 -16
  143. data/src/core/lib/iomgr/fork_posix.cc +42 -19
  144. data/src/core/lib/iomgr/iocp_windows.cc +9 -4
  145. data/src/core/lib/iomgr/iomgr.cc +2 -0
  146. data/src/core/lib/iomgr/iomgr.h +5 -0
  147. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  148. data/src/core/lib/iomgr/is_epollexclusive_available.cc +1 -0
  149. data/src/core/lib/iomgr/lockfree_event.cc +5 -1
  150. data/src/core/lib/iomgr/polling_entity.cc +11 -2
  151. data/src/core/lib/iomgr/pollset_custom.cc +2 -2
  152. data/src/core/lib/iomgr/port.h +51 -1
  153. data/src/core/lib/iomgr/resolve_address.h +1 -1
  154. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  155. data/src/core/lib/iomgr/resolve_address_windows.cc +3 -2
  156. data/src/core/lib/iomgr/resource_quota.cc +89 -12
  157. data/src/core/lib/iomgr/resource_quota.h +16 -0
  158. data/src/core/lib/iomgr/sockaddr_posix.h +1 -1
  159. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  160. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  161. data/src/core/lib/iomgr/socket_mutator.h +1 -1
  162. data/src/core/lib/iomgr/socket_utils.h +9 -0
  163. data/src/core/lib/iomgr/socket_utils_common_posix.cc +29 -1
  164. data/src/core/lib/iomgr/socket_utils_linux.cc +0 -1
  165. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -3
  166. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  167. data/src/core/lib/iomgr/socket_utils_uv.cc +4 -0
  168. data/src/core/lib/iomgr/socket_utils_windows.cc +4 -0
  169. data/src/core/lib/iomgr/socket_windows.cc +33 -0
  170. data/src/core/lib/iomgr/socket_windows.h +6 -0
  171. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -5
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +10 -11
  173. data/src/core/lib/iomgr/tcp_custom.cc +11 -11
  174. data/src/core/lib/iomgr/tcp_posix.cc +49 -36
  175. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
  176. data/src/core/lib/iomgr/tcp_server_posix.cc +16 -36
  177. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  178. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +17 -5
  179. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -0
  180. data/src/core/lib/iomgr/tcp_uv.cc +3 -0
  181. data/src/core/lib/iomgr/tcp_windows.cc +18 -2
  182. data/src/core/lib/iomgr/tcp_windows.h +2 -0
  183. data/src/core/lib/iomgr/timer.h +4 -3
  184. data/src/core/lib/iomgr/timer_generic.cc +133 -51
  185. data/src/core/lib/iomgr/timer_manager.cc +12 -14
  186. data/src/core/lib/iomgr/timer_uv.cc +3 -0
  187. data/src/core/lib/iomgr/udp_server.cc +106 -52
  188. data/src/core/lib/iomgr/udp_server.h +8 -4
  189. data/src/core/lib/json/json.cc +12 -1
  190. data/src/core/lib/json/json.h +5 -0
  191. data/src/core/lib/profiling/basic_timers.cc +1 -0
  192. data/src/core/lib/security/context/security_context.cc +8 -8
  193. data/src/core/lib/security/context/security_context.h +6 -2
  194. data/src/core/lib/security/credentials/alts/alts_credentials.h +0 -20
  195. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +3 -2
  196. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +7 -7
  197. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +1 -38
  198. data/src/core/lib/security/credentials/credentials.h +1 -0
  199. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +89 -115
  200. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +16 -0
  201. data/src/core/lib/security/credentials/jwt/json_token.h +2 -0
  202. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +2 -0
  203. data/src/core/lib/security/credentials/local/local_credentials.cc +77 -0
  204. data/src/core/lib/security/credentials/local/local_credentials.h +40 -0
  205. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +11 -7
  206. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  207. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +17 -3
  208. data/src/core/lib/security/security_connector/alts_security_connector.cc +2 -1
  209. data/src/core/lib/security/security_connector/load_system_roots.h +29 -0
  210. data/src/core/lib/{gpr/fork.h → security/security_connector/load_system_roots_fallback.cc} +10 -13
  211. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +165 -0
  212. data/src/core/lib/security/security_connector/load_system_roots_linux.h +44 -0
  213. data/src/core/lib/security/security_connector/local_security_connector.cc +245 -0
  214. data/src/core/lib/security/security_connector/local_security_connector.h +58 -0
  215. data/src/core/lib/security/security_connector/security_connector.cc +79 -32
  216. data/src/core/lib/security/security_connector/security_connector.h +5 -3
  217. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  218. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  219. data/src/core/lib/security/transport/security_handshaker.cc +7 -2
  220. data/src/core/lib/security/transport/server_auth_filter.cc +4 -7
  221. data/src/core/lib/security/util/json_util.cc +4 -0
  222. data/src/core/lib/slice/slice.cc +6 -2
  223. data/src/core/lib/slice/slice_buffer.cc +27 -7
  224. data/src/core/lib/slice/slice_hash_table.h +4 -0
  225. data/src/core/lib/slice/slice_weak_hash_table.h +4 -0
  226. data/src/core/lib/surface/call.cc +119 -58
  227. data/src/core/lib/surface/call.h +7 -0
  228. data/src/core/lib/surface/channel.cc +50 -18
  229. data/src/core/lib/surface/channel.h +4 -0
  230. data/src/core/lib/surface/completion_queue.cc +153 -18
  231. data/src/core/lib/surface/completion_queue.h +20 -2
  232. data/src/core/lib/surface/completion_queue_factory.cc +13 -4
  233. data/src/core/lib/surface/init.cc +7 -8
  234. data/src/core/lib/surface/init.h +0 -1
  235. data/src/core/lib/surface/server.cc +16 -0
  236. data/src/core/lib/surface/version.cc +1 -1
  237. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  238. data/src/core/lib/transport/bdp_estimator.h +2 -2
  239. data/src/core/lib/transport/byte_stream.cc +1 -1
  240. data/src/core/lib/transport/connectivity_state.cc +6 -7
  241. data/src/core/lib/transport/service_config.cc +2 -2
  242. data/src/core/lib/transport/service_config.h +3 -3
  243. data/src/core/lib/transport/transport.cc +22 -10
  244. data/src/core/lib/transport/transport.h +18 -18
  245. data/src/core/lib/transport/transport_op_string.cc +1 -8
  246. data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -4
  247. data/src/core/tsi/alts/crypt/aes_gcm.cc +2 -0
  248. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -7
  249. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +10 -0
  250. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +2 -2
  251. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +38 -3
  252. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -0
  253. data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -1
  254. data/src/core/tsi/alts/handshaker/altscontext.pb.h +1 -2
  255. data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -1
  256. data/src/core/tsi/alts/handshaker/handshaker.pb.h +1 -2
  257. data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -1
  258. data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +1 -1
  259. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  260. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +47 -1
  261. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +3 -1
  262. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -11
  263. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +7 -2
  264. data/src/core/tsi/fake_transport_security.cc +1 -0
  265. data/src/core/tsi/grpc_shadow_boringssl.h +3006 -0
  266. data/src/core/tsi/local_transport_security.cc +209 -0
  267. data/src/core/tsi/local_transport_security.h +51 -0
  268. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  269. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +5 -5
  270. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +6 -0
  271. data/src/core/tsi/ssl_transport_security.cc +245 -116
  272. data/src/core/tsi/ssl_types.h +2 -0
  273. data/src/core/tsi/transport_security.cc +14 -0
  274. data/src/core/tsi/transport_security.h +2 -0
  275. data/src/core/tsi/transport_security_interface.h +11 -1
  276. data/src/ruby/bin/math_client.rb +17 -9
  277. data/src/ruby/ext/grpc/extconf.rb +1 -26
  278. data/src/ruby/ext/grpc/rb_channel_credentials.c +3 -3
  279. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +42 -16
  280. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +65 -26
  281. data/src/ruby/lib/grpc/generic/active_call.rb +19 -23
  282. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -1
  283. data/src/ruby/lib/grpc/version.rb +1 -1
  284. data/src/ruby/pb/generate_proto_ruby.sh +7 -1
  285. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +4 -1
  286. data/src/ruby/spec/call_credentials_spec.rb +1 -1
  287. data/src/ruby/spec/call_spec.rb +1 -1
  288. data/src/ruby/spec/channel_credentials_spec.rb +1 -1
  289. data/src/ruby/spec/channel_spec.rb +1 -1
  290. data/src/ruby/spec/client_auth_spec.rb +1 -12
  291. data/src/ruby/spec/client_server_spec.rb +1 -1
  292. data/src/ruby/spec/compression_options_spec.rb +1 -1
  293. data/src/ruby/spec/error_sanity_spec.rb +1 -1
  294. data/src/ruby/spec/generic/client_stub_spec.rb +16 -4
  295. data/src/ruby/spec/generic/rpc_desc_spec.rb +1 -1
  296. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  297. data/src/ruby/spec/generic/service_spec.rb +1 -1
  298. data/src/ruby/spec/google_rpc_status_utils_spec.rb +1 -12
  299. data/src/ruby/spec/pb/duplicate/codegen_spec.rb +1 -0
  300. data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
  301. data/src/ruby/spec/server_credentials_spec.rb +1 -1
  302. data/src/ruby/spec/server_spec.rb +1 -1
  303. data/src/ruby/spec/spec_helper.rb +1 -0
  304. data/src/ruby/spec/support/services.rb +1 -1
  305. data/src/ruby/spec/time_consts_spec.rb +1 -1
  306. data/third_party/address_sorting/address_sorting.c +17 -11
  307. data/third_party/address_sorting/address_sorting_windows.c +43 -3
  308. data/third_party/address_sorting/include/address_sorting/address_sorting.h +3 -0
  309. data/third_party/boringssl/crypto/asn1/a_int.c +33 -28
  310. data/third_party/boringssl/crypto/asn1/a_mbstr.c +24 -22
  311. data/third_party/boringssl/crypto/asn1/a_utf8.c +13 -11
  312. data/third_party/boringssl/crypto/asn1/asn1_locl.h +3 -0
  313. data/third_party/boringssl/crypto/asn1/tasn_dec.c +40 -19
  314. data/third_party/boringssl/crypto/bio/fd.c +1 -0
  315. data/third_party/boringssl/crypto/bio/file.c +2 -0
  316. data/third_party/boringssl/crypto/bn_extra/convert.c +6 -5
  317. data/third_party/boringssl/crypto/bytestring/ber.c +1 -4
  318. data/third_party/boringssl/crypto/bytestring/cbb.c +116 -16
  319. data/third_party/boringssl/crypto/bytestring/cbs.c +151 -20
  320. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +203 -0
  321. data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +2 -0
  322. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +1 -2
  323. data/third_party/boringssl/crypto/cpu-aarch64-fuchsia.c +55 -0
  324. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +2 -1
  325. data/third_party/boringssl/crypto/dsa/dsa.c +16 -54
  326. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +9 -10
  327. data/third_party/boringssl/crypto/ecdh/ecdh.c +4 -3
  328. data/third_party/boringssl/crypto/fipsmodule/bcm.c +11 -542
  329. data/third_party/boringssl/crypto/fipsmodule/bn/add.c +57 -112
  330. data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +4 -3
  331. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +128 -70
  332. data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +32 -71
  333. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +64 -118
  334. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +284 -122
  335. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +31 -65
  336. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +274 -218
  337. data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +2 -1
  338. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +187 -27
  339. data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +1 -1
  340. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +124 -81
  341. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +8 -30
  342. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +321 -347
  343. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +326 -66
  344. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +77 -25
  345. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +199 -222
  346. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +27 -47
  347. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +155 -96
  348. data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +1 -1
  349. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +10 -10
  350. data/third_party/boringssl/crypto/fipsmodule/des/internal.h +2 -0
  351. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +78 -47
  352. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +99 -163
  353. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +3 -10
  354. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +44 -23
  355. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +59 -90
  356. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +38 -65
  357. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +5378 -5418
  358. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +17 -26
  359. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +15 -11
  360. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +45 -51
  361. data/third_party/boringssl/crypto/fipsmodule/ec/{util-64.c → util.c} +0 -5
  362. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +144 -264
  363. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +78 -62
  364. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +256 -0
  365. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +36 -32
  366. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +9 -7
  367. data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +16 -40
  368. data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +1 -6
  369. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +57 -39
  370. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +309 -142
  371. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +581 -0
  372. data/third_party/boringssl/crypto/fipsmodule/tls/internal.h +39 -0
  373. data/third_party/boringssl/crypto/fipsmodule/tls/kdf.c +165 -0
  374. data/third_party/boringssl/crypto/internal.h +65 -2
  375. data/third_party/boringssl/crypto/mem.c +0 -2
  376. data/third_party/boringssl/crypto/obj/obj.c +6 -73
  377. data/third_party/boringssl/crypto/thread_pthread.c +35 -5
  378. data/third_party/boringssl/crypto/x509/a_strex.c +11 -11
  379. data/third_party/boringssl/crypto/x509/vpm_int.h +1 -0
  380. data/third_party/boringssl/crypto/x509/x509_vfy.c +4 -0
  381. data/third_party/boringssl/crypto/x509/x509_vpm.c +44 -22
  382. data/third_party/boringssl/crypto/x509/x_name.c +13 -0
  383. data/third_party/boringssl/include/openssl/aead.h +10 -0
  384. data/third_party/boringssl/include/openssl/asn1.h +2 -3
  385. data/third_party/boringssl/include/openssl/base.h +5 -14
  386. data/third_party/boringssl/include/openssl/bio.h +1 -1
  387. data/third_party/boringssl/include/openssl/bn.h +62 -18
  388. data/third_party/boringssl/include/openssl/bytestring.h +53 -28
  389. data/third_party/boringssl/include/openssl/crypto.h +4 -0
  390. data/third_party/boringssl/include/openssl/ec.h +10 -4
  391. data/third_party/boringssl/include/openssl/ec_key.h +7 -6
  392. data/third_party/boringssl/include/openssl/err.h +9 -9
  393. data/third_party/boringssl/include/openssl/evp.h +1 -1
  394. data/third_party/boringssl/include/openssl/rsa.h +35 -10
  395. data/third_party/boringssl/include/openssl/ssl.h +167 -19
  396. data/third_party/boringssl/include/openssl/ssl3.h +0 -1
  397. data/third_party/boringssl/include/openssl/stack.h +1 -1
  398. data/third_party/boringssl/include/openssl/tls1.h +10 -2
  399. data/third_party/boringssl/include/openssl/x509.h +4 -0
  400. data/third_party/boringssl/include/openssl/x509v3.h +1 -0
  401. data/third_party/boringssl/ssl/d1_both.cc +16 -2
  402. data/third_party/boringssl/ssl/dtls_method.cc +1 -1
  403. data/third_party/boringssl/ssl/handoff.cc +285 -0
  404. data/third_party/boringssl/ssl/handshake.cc +26 -12
  405. data/third_party/boringssl/ssl/handshake_client.cc +101 -95
  406. data/third_party/boringssl/ssl/handshake_server.cc +14 -2
  407. data/third_party/boringssl/ssl/internal.h +132 -79
  408. data/third_party/boringssl/ssl/s3_both.cc +2 -2
  409. data/third_party/boringssl/ssl/s3_lib.cc +3 -1
  410. data/third_party/boringssl/ssl/s3_pkt.cc +0 -18
  411. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +1 -4
  412. data/third_party/boringssl/ssl/ssl_asn1.cc +47 -43
  413. data/third_party/boringssl/ssl/ssl_cipher.cc +12 -8
  414. data/third_party/boringssl/ssl/ssl_key_share.cc +3 -1
  415. data/third_party/boringssl/ssl/ssl_lib.cc +83 -14
  416. data/third_party/boringssl/ssl/ssl_privkey.cc +6 -0
  417. data/third_party/boringssl/ssl/ssl_stat.cc +6 -6
  418. data/third_party/boringssl/ssl/ssl_versions.cc +12 -85
  419. data/third_party/boringssl/ssl/ssl_x509.cc +59 -61
  420. data/third_party/boringssl/ssl/t1_enc.cc +73 -124
  421. data/third_party/boringssl/ssl/t1_lib.cc +367 -41
  422. data/third_party/boringssl/ssl/tls13_both.cc +8 -0
  423. data/third_party/boringssl/ssl/tls13_client.cc +98 -184
  424. data/third_party/boringssl/ssl/tls13_enc.cc +88 -158
  425. data/third_party/boringssl/ssl/tls13_server.cc +91 -137
  426. data/third_party/boringssl/ssl/tls_method.cc +0 -17
  427. data/third_party/boringssl/ssl/tls_record.cc +1 -10
  428. data/third_party/boringssl/third_party/fiat/curve25519.c +921 -2753
  429. data/third_party/boringssl/third_party/fiat/curve25519_tables.h +7880 -0
  430. data/third_party/boringssl/third_party/fiat/internal.h +32 -20
  431. data/third_party/boringssl/third_party/fiat/p256.c +1824 -0
  432. metadata +86 -71
  433. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +0 -253
  434. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +0 -222
  435. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +0 -71
  436. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +0 -61
  437. data/src/core/lib/channel/channel_trace_registry.cc +0 -80
  438. data/src/core/lib/channel/channel_trace_registry.h +0 -43
  439. data/src/core/lib/gpr/fork.cc +0 -78
  440. data/src/core/tsi/transport_security_adapter.cc +0 -235
  441. data/src/core/tsi/transport_security_adapter.h +0 -41
  442. data/src/ruby/bin/apis/google/protobuf/empty.rb +0 -29
  443. data/src/ruby/bin/apis/pubsub_demo.rb +0 -241
  444. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +0 -159
  445. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +0 -88
  446. data/src/ruby/pb/test/client.rb +0 -764
  447. data/src/ruby/pb/test/server.rb +0 -252
  448. data/src/ruby/spec/pb/package_with_underscore/checker_spec.rb +0 -54
  449. data/src/ruby/spec/pb/package_with_underscore/data.proto +0 -23
  450. data/src/ruby/spec/pb/package_with_underscore/service.proto +0 -23
  451. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +0 -247
  452. data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +0 -1674
@@ -1,24 +1,20 @@
1
- /* Copyright (c) 2014, Intel Corporation.
1
+ /*
2
+ * Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
3
+ * Copyright (c) 2014, Intel Corporation. All Rights Reserved.
2
4
  *
3
- * Permission to use, copy, modify, and/or distribute this software for any
4
- * purpose with or without fee is hereby granted, provided that the above
5
- * copyright notice and this permission notice appear in all copies.
5
+ * Licensed under the OpenSSL license (the "License"). You may not use
6
+ * this file except in compliance with the License. You can obtain a copy
7
+ * in the file LICENSE in the source distribution or at
8
+ * https://www.openssl.org/source/license.html
6
9
  *
7
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
-
15
- // Developers and authors:
16
- // Shay Gueron (1, 2), and Vlad Krasnov (1)
17
- // (1) Intel Corporation, Israel Development Center
18
- // (2) University of Haifa
19
- // Reference:
20
- // S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with
21
- // 256 Bit Primes"
10
+ * Originally written by Shay Gueron (1, 2), and Vlad Krasnov (1)
11
+ * (1) Intel Corporation, Israel Development Center, Haifa, Israel
12
+ * (2) University of Haifa, Israel
13
+ *
14
+ * Reference:
15
+ * S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with
16
+ * 256 Bit Primes"
17
+ */
22
18
 
23
19
  #include <openssl/ec.h>
24
20
 
@@ -205,13 +201,7 @@ static void ecp_nistz256_mod_inverse_mont(BN_ULONG r[P256_LIMBS],
205
201
  // returns one if it fits. Otherwise it returns zero.
206
202
  static int ecp_nistz256_bignum_to_field_elem(BN_ULONG out[P256_LIMBS],
207
203
  const BIGNUM *in) {
208
- if (in->top > P256_LIMBS) {
209
- return 0;
210
- }
211
-
212
- OPENSSL_memset(out, 0, sizeof(BN_ULONG) * P256_LIMBS);
213
- OPENSSL_memcpy(out, in->d, sizeof(BN_ULONG) * in->top);
214
- return 1;
204
+ return bn_copy_words(out, P256_LIMBS, in);
215
205
  }
216
206
 
217
207
  // r = p * p_scalar
@@ -446,6 +436,7 @@ DEFINE_METHOD_FUNCTION(EC_METHOD, EC_GFp_nistz256_method) {
446
436
  out->group_set_curve = ec_GFp_mont_group_set_curve;
447
437
  out->point_get_affine_coordinates = ecp_nistz256_get_affine;
448
438
  out->mul = ecp_nistz256_points_mul;
439
+ out->mul_public = ecp_nistz256_points_mul;
449
440
  out->field_mul = ec_GFp_mont_field_mul;
450
441
  out->field_sqr = ec_GFp_mont_field_sqr;
451
442
  out->field_encode = ec_GFp_mont_field_encode;
@@ -1,16 +1,20 @@
1
- /* Copyright (c) 2014, Intel Corporation.
1
+ /*
2
+ * Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
3
+ * Copyright (c) 2014, Intel Corporation. All Rights Reserved.
2
4
  *
3
- * Permission to use, copy, modify, and/or distribute this software for any
4
- * purpose with or without fee is hereby granted, provided that the above
5
- * copyright notice and this permission notice appear in all copies.
5
+ * Licensed under the OpenSSL license (the "License"). You may not use
6
+ * this file except in compliance with the License. You can obtain a copy
7
+ * in the file LICENSE in the source distribution or at
8
+ * https://www.openssl.org/source/license.html
6
9
  *
7
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
10
+ * Originally written by Shay Gueron (1, 2), and Vlad Krasnov (1)
11
+ * (1) Intel Corporation, Israel Development Center, Haifa, Israel
12
+ * (2) University of Haifa, Israel
13
+ *
14
+ * Reference:
15
+ * S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with
16
+ * 256 Bit Primes"
17
+ */
14
18
 
15
19
  #ifndef OPENSSL_HEADER_EC_P256_X86_64_H
16
20
  #define OPENSSL_HEADER_EC_P256_X86_64_H
@@ -135,9 +135,11 @@ int ec_GFp_simple_group_set_curve(EC_GROUP *group, const BIGNUM *p,
135
135
  goto err;
136
136
  }
137
137
  BN_set_negative(&group->field, 0);
138
+ // Store the field in minimal form, so it can be used with |BN_ULONG| arrays.
139
+ bn_set_minimal_width(&group->field);
138
140
 
139
141
  // group->a
140
- if (!BN_nnmod(tmp_a, a, p, ctx)) {
142
+ if (!BN_nnmod(tmp_a, a, &group->field, ctx)) {
141
143
  goto err;
142
144
  }
143
145
  if (group->meth->field_encode) {
@@ -149,7 +151,7 @@ int ec_GFp_simple_group_set_curve(EC_GROUP *group, const BIGNUM *p,
149
151
  }
150
152
 
151
153
  // group->b
152
- if (!BN_nnmod(&group->b, b, p, ctx)) {
154
+ if (!BN_nnmod(&group->b, b, &group->field, ctx)) {
153
155
  goto err;
154
156
  }
155
157
  if (group->meth->field_encode &&
@@ -269,9 +271,14 @@ static int set_Jprojective_coordinate_GFp(const EC_GROUP *group, BIGNUM *out,
269
271
  return BN_copy(out, in) != NULL;
270
272
  }
271
273
 
272
- int ec_GFp_simple_set_Jprojective_coordinates_GFp(
273
- const EC_GROUP *group, EC_POINT *point, const BIGNUM *x, const BIGNUM *y,
274
- const BIGNUM *z, BN_CTX *ctx) {
274
+ int ec_GFp_simple_point_set_affine_coordinates(const EC_GROUP *group,
275
+ EC_POINT *point, const BIGNUM *x,
276
+ const BIGNUM *y, BN_CTX *ctx) {
277
+ if (x == NULL || y == NULL) {
278
+ OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER);
279
+ return 0;
280
+ }
281
+
275
282
  BN_CTX *new_ctx = NULL;
276
283
  int ret = 0;
277
284
 
@@ -284,7 +291,7 @@ int ec_GFp_simple_set_Jprojective_coordinates_GFp(
284
291
 
285
292
  if (!set_Jprojective_coordinate_GFp(group, &point->X, x, ctx) ||
286
293
  !set_Jprojective_coordinate_GFp(group, &point->Y, y, ctx) ||
287
- !set_Jprojective_coordinate_GFp(group, &point->Z, z, ctx)) {
294
+ !BN_copy(&point->Z, &group->one)) {
288
295
  goto err;
289
296
  }
290
297
 
@@ -295,19 +302,6 @@ err:
295
302
  return ret;
296
303
  }
297
304
 
298
- int ec_GFp_simple_point_set_affine_coordinates(const EC_GROUP *group,
299
- EC_POINT *point, const BIGNUM *x,
300
- const BIGNUM *y, BN_CTX *ctx) {
301
- if (x == NULL || y == NULL) {
302
- // unlike for projective coordinates, we do not tolerate this
303
- OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER);
304
- return 0;
305
- }
306
-
307
- return ec_point_set_Jprojective_coordinates_GFp(group, point, x, y,
308
- BN_value_one(), ctx);
309
- }
310
-
311
305
  int ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
312
306
  const EC_POINT *b, BN_CTX *ctx) {
313
307
  int (*field_mul)(const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *,
@@ -401,8 +395,8 @@ int ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
401
395
  }
402
396
 
403
397
  // n5, n6
404
- if (!BN_mod_sub_quick(n5, n1, n3, p) ||
405
- !BN_mod_sub_quick(n6, n2, n4, p)) {
398
+ if (!bn_mod_sub_consttime(n5, n1, n3, p, ctx) ||
399
+ !bn_mod_sub_consttime(n6, n2, n4, p, ctx)) {
406
400
  goto end;
407
401
  }
408
402
  // n5 = n1 - n3
@@ -424,8 +418,8 @@ int ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
424
418
  }
425
419
 
426
420
  // 'n7', 'n8'
427
- if (!BN_mod_add_quick(n1, n1, n3, p) ||
428
- !BN_mod_add_quick(n2, n2, n4, p)) {
421
+ if (!bn_mod_add_consttime(n1, n1, n3, p, ctx) ||
422
+ !bn_mod_add_consttime(n2, n2, n4, p, ctx)) {
429
423
  goto end;
430
424
  }
431
425
  // 'n7' = n1 + n3
@@ -459,14 +453,14 @@ int ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
459
453
  if (!field_sqr(group, n0, n6, ctx) ||
460
454
  !field_sqr(group, n4, n5, ctx) ||
461
455
  !field_mul(group, n3, n1, n4, ctx) ||
462
- !BN_mod_sub_quick(&r->X, n0, n3, p)) {
456
+ !bn_mod_sub_consttime(&r->X, n0, n3, p, ctx)) {
463
457
  goto end;
464
458
  }
465
459
  // X_r = n6^2 - n5^2 * 'n7'
466
460
 
467
461
  // 'n9'
468
- if (!BN_mod_lshift1_quick(n0, &r->X, p) ||
469
- !BN_mod_sub_quick(n0, n3, n0, p)) {
462
+ if (!bn_mod_lshift1_consttime(n0, &r->X, p, ctx) ||
463
+ !bn_mod_sub_consttime(n0, n3, n0, p, ctx)) {
470
464
  goto end;
471
465
  }
472
466
  // n9 = n5^2 * 'n7' - 2 * X_r
@@ -477,7 +471,7 @@ int ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
477
471
  goto end; // now n5 is n5^3
478
472
  }
479
473
  if (!field_mul(group, n1, n2, n5, ctx) ||
480
- !BN_mod_sub_quick(n0, n0, n1, p)) {
474
+ !bn_mod_sub_consttime(n0, n0, n1, p, ctx)) {
481
475
  goto end;
482
476
  }
483
477
  if (BN_is_odd(n0) && !BN_add(n0, n0, p)) {
@@ -542,31 +536,31 @@ int ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
542
536
  // n1
543
537
  if (BN_cmp(&a->Z, &group->one) == 0) {
544
538
  if (!field_sqr(group, n0, &a->X, ctx) ||
545
- !BN_mod_lshift1_quick(n1, n0, p) ||
546
- !BN_mod_add_quick(n0, n0, n1, p) ||
547
- !BN_mod_add_quick(n1, n0, &group->a, p)) {
539
+ !bn_mod_lshift1_consttime(n1, n0, p, ctx) ||
540
+ !bn_mod_add_consttime(n0, n0, n1, p, ctx) ||
541
+ !bn_mod_add_consttime(n1, n0, &group->a, p, ctx)) {
548
542
  goto err;
549
543
  }
550
544
  // n1 = 3 * X_a^2 + a_curve
551
545
  } else if (group->a_is_minus3) {
552
546
  if (!field_sqr(group, n1, &a->Z, ctx) ||
553
- !BN_mod_add_quick(n0, &a->X, n1, p) ||
554
- !BN_mod_sub_quick(n2, &a->X, n1, p) ||
547
+ !bn_mod_add_consttime(n0, &a->X, n1, p, ctx) ||
548
+ !bn_mod_sub_consttime(n2, &a->X, n1, p, ctx) ||
555
549
  !field_mul(group, n1, n0, n2, ctx) ||
556
- !BN_mod_lshift1_quick(n0, n1, p) ||
557
- !BN_mod_add_quick(n1, n0, n1, p)) {
550
+ !bn_mod_lshift1_consttime(n0, n1, p, ctx) ||
551
+ !bn_mod_add_consttime(n1, n0, n1, p, ctx)) {
558
552
  goto err;
559
553
  }
560
554
  // n1 = 3 * (X_a + Z_a^2) * (X_a - Z_a^2)
561
555
  // = 3 * X_a^2 - 3 * Z_a^4
562
556
  } else {
563
557
  if (!field_sqr(group, n0, &a->X, ctx) ||
564
- !BN_mod_lshift1_quick(n1, n0, p) ||
565
- !BN_mod_add_quick(n0, n0, n1, p) ||
558
+ !bn_mod_lshift1_consttime(n1, n0, p, ctx) ||
559
+ !bn_mod_add_consttime(n0, n0, n1, p, ctx) ||
566
560
  !field_sqr(group, n1, &a->Z, ctx) ||
567
561
  !field_sqr(group, n1, n1, ctx) ||
568
562
  !field_mul(group, n1, n1, &group->a, ctx) ||
569
- !BN_mod_add_quick(n1, n1, n0, p)) {
563
+ !bn_mod_add_consttime(n1, n1, n0, p, ctx)) {
570
564
  goto err;
571
565
  }
572
566
  // n1 = 3 * X_a^2 + a_curve * Z_a^4
@@ -580,7 +574,7 @@ int ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
580
574
  } else if (!field_mul(group, n0, &a->Y, &a->Z, ctx)) {
581
575
  goto err;
582
576
  }
583
- if (!BN_mod_lshift1_quick(&r->Z, n0, p)) {
577
+ if (!bn_mod_lshift1_consttime(&r->Z, n0, p, ctx)) {
584
578
  goto err;
585
579
  }
586
580
  // Z_r = 2 * Y_a * Z_a
@@ -588,30 +582,30 @@ int ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
588
582
  // n2
589
583
  if (!field_sqr(group, n3, &a->Y, ctx) ||
590
584
  !field_mul(group, n2, &a->X, n3, ctx) ||
591
- !BN_mod_lshift_quick(n2, n2, 2, p)) {
585
+ !bn_mod_lshift_consttime(n2, n2, 2, p, ctx)) {
592
586
  goto err;
593
587
  }
594
588
  // n2 = 4 * X_a * Y_a^2
595
589
 
596
590
  // X_r
597
- if (!BN_mod_lshift1_quick(n0, n2, p) ||
591
+ if (!bn_mod_lshift1_consttime(n0, n2, p, ctx) ||
598
592
  !field_sqr(group, &r->X, n1, ctx) ||
599
- !BN_mod_sub_quick(&r->X, &r->X, n0, p)) {
593
+ !bn_mod_sub_consttime(&r->X, &r->X, n0, p, ctx)) {
600
594
  goto err;
601
595
  }
602
596
  // X_r = n1^2 - 2 * n2
603
597
 
604
598
  // n3
605
599
  if (!field_sqr(group, n0, n3, ctx) ||
606
- !BN_mod_lshift_quick(n3, n0, 3, p)) {
600
+ !bn_mod_lshift_consttime(n3, n0, 3, p, ctx)) {
607
601
  goto err;
608
602
  }
609
603
  // n3 = 8 * Y_a^4
610
604
 
611
605
  // Y_r
612
- if (!BN_mod_sub_quick(n0, n2, &r->X, p) ||
606
+ if (!bn_mod_sub_consttime(n0, n2, &r->X, p, ctx) ||
613
607
  !field_mul(group, n0, n1, n0, ctx) ||
614
- !BN_mod_sub_quick(&r->Y, n0, n3, p)) {
608
+ !bn_mod_sub_consttime(&r->Y, n0, n3, p, ctx)) {
615
609
  goto err;
616
610
  }
617
611
  // Y_r = n1 * (n2 - X_r) - n3
@@ -694,15 +688,15 @@ int ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point,
694
688
 
695
689
  // rh := (rh + a*Z^4)*X
696
690
  if (group->a_is_minus3) {
697
- if (!BN_mod_lshift1_quick(tmp, Z4, p) ||
698
- !BN_mod_add_quick(tmp, tmp, Z4, p) ||
699
- !BN_mod_sub_quick(rh, rh, tmp, p) ||
691
+ if (!bn_mod_lshift1_consttime(tmp, Z4, p, ctx) ||
692
+ !bn_mod_add_consttime(tmp, tmp, Z4, p, ctx) ||
693
+ !bn_mod_sub_consttime(rh, rh, tmp, p, ctx) ||
700
694
  !field_mul(group, rh, rh, &point->X, ctx)) {
701
695
  goto err;
702
696
  }
703
697
  } else {
704
698
  if (!field_mul(group, tmp, Z4, &group->a, ctx) ||
705
- !BN_mod_add_quick(rh, rh, tmp, p) ||
699
+ !bn_mod_add_consttime(rh, rh, tmp, p, ctx) ||
706
700
  !field_mul(group, rh, rh, &point->X, ctx)) {
707
701
  goto err;
708
702
  }
@@ -710,17 +704,17 @@ int ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point,
710
704
 
711
705
  // rh := rh + b*Z^6
712
706
  if (!field_mul(group, tmp, &group->b, Z6, ctx) ||
713
- !BN_mod_add_quick(rh, rh, tmp, p)) {
707
+ !bn_mod_add_consttime(rh, rh, tmp, p, ctx)) {
714
708
  goto err;
715
709
  }
716
710
  } else {
717
711
  // rh := (rh + a)*X
718
- if (!BN_mod_add_quick(rh, rh, &group->a, p) ||
712
+ if (!bn_mod_add_consttime(rh, rh, &group->a, p, ctx) ||
719
713
  !field_mul(group, rh, rh, &point->X, ctx)) {
720
714
  goto err;
721
715
  }
722
716
  // rh := rh + b
723
- if (!BN_mod_add_quick(rh, rh, &group->b, p)) {
717
+ if (!bn_mod_add_consttime(rh, rh, &group->b, p, ctx)) {
724
718
  goto err;
725
719
  }
726
720
  }
@@ -14,9 +14,6 @@
14
14
 
15
15
  #include <openssl/base.h>
16
16
 
17
-
18
- #if defined(OPENSSL_64_BIT) && !defined(OPENSSL_WINDOWS)
19
-
20
17
  #include <openssl/ec.h>
21
18
 
22
19
  #include "internal.h"
@@ -105,5 +102,3 @@ void ec_GFp_nistp_recode_scalar_bits(uint8_t *sign, uint8_t *digit,
105
102
  *sign = s & 1;
106
103
  *digit = d;
107
104
  }
108
-
109
- #endif // 64_BIT && !WINDOWS
@@ -73,8 +73,10 @@
73
73
  #include <openssl/err.h>
74
74
  #include <openssl/mem.h>
75
75
  #include <openssl/thread.h>
76
+ #include <openssl/type_check.h>
76
77
 
77
78
  #include "internal.h"
79
+ #include "../bn/internal.h"
78
80
  #include "../../internal.h"
79
81
 
80
82
 
@@ -83,58 +85,21 @@
83
85
  // http://link.springer.com/chapter/10.1007%2F3-540-45537-X_13
84
86
  // http://www.bmoeller.de/pdf/TI-01-08.multiexp.pdf
85
87
 
86
- // Determine the modified width-(w+1) Non-Adjacent Form (wNAF) of 'scalar'.
87
- // This is an array r[] of values that are either zero or odd with an
88
- // absolute value less than 2^w satisfying
89
- // scalar = \sum_j r[j]*2^j
90
- // where at most one of any w+1 consecutive digits is non-zero
91
- // with the exception that the most significant digit may be only
92
- // w-1 zeros away from that next non-zero digit.
93
- static int8_t *compute_wNAF(const BIGNUM *scalar, int w, size_t *ret_len) {
94
- int window_val;
95
- int ok = 0;
96
- int8_t *r = NULL;
97
- int sign = 1;
98
- int bit, next_bit, mask;
99
- size_t len = 0, j;
100
-
101
- if (BN_is_zero(scalar)) {
102
- r = OPENSSL_malloc(1);
103
- if (!r) {
104
- OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE);
105
- goto err;
106
- }
107
- r[0] = 0;
108
- *ret_len = 1;
109
- return r;
110
- }
111
-
88
+ int ec_compute_wNAF(const EC_GROUP *group, int8_t *out, const EC_SCALAR *scalar,
89
+ size_t bits, int w) {
112
90
  // 'int8_t' can represent integers with absolute values less than 2^7.
113
- if (w <= 0 || w > 7) {
91
+ if (w <= 0 || w > 7 || bits == 0) {
114
92
  OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
115
- goto err;
116
- }
117
- bit = 1 << w; // at most 128
118
- next_bit = bit << 1; // at most 256
119
- mask = next_bit - 1; // at most 255
120
-
121
- if (BN_is_negative(scalar)) {
122
- sign = -1;
93
+ return 0;
123
94
  }
124
-
125
- len = BN_num_bits(scalar);
126
- // The modified wNAF may be one digit longer than binary representation
127
- // (*ret_len will be set to the actual length, i.e. at most
128
- // BN_num_bits(scalar) + 1).
129
- r = OPENSSL_malloc(len + 1);
130
- if (r == NULL) {
131
- OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE);
132
- goto err;
133
- }
134
- window_val = scalar->d[0] & mask;
135
- j = 0;
136
- // If j+w+1 >= len, window_val will not increase.
137
- while (window_val != 0 || j + w + 1 < len) {
95
+ int bit = 1 << w; // at most 128
96
+ int next_bit = bit << 1; // at most 256
97
+ int mask = next_bit - 1; // at most 255
98
+
99
+ int window_val = scalar->words[0] & mask;
100
+ size_t j = 0;
101
+ // If j+w+1 >= bits, window_val will not increase.
102
+ while (window_val != 0 || j + w + 1 < bits) {
138
103
  int digit = 0;
139
104
 
140
105
  // 0 <= window_val <= 2^(w+1)
@@ -146,7 +111,7 @@ static int8_t *compute_wNAF(const BIGNUM *scalar, int w, size_t *ret_len) {
146
111
  digit = window_val - next_bit; // -2^w < digit < 0
147
112
 
148
113
  #if 1 // modified wNAF
149
- if (j + w + 1 >= len) {
114
+ if (j + w + 1 >= bits) {
150
115
  // special case for generating modified wNAFs:
151
116
  // no new bits will be added into window_val,
152
117
  // so using a positive digit here will decrease
@@ -161,7 +126,7 @@ static int8_t *compute_wNAF(const BIGNUM *scalar, int w, size_t *ret_len) {
161
126
 
162
127
  if (digit <= -bit || digit >= bit || !(digit & 1)) {
163
128
  OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
164
- goto err;
129
+ return 0;
165
130
  }
166
131
 
167
132
  window_val -= digit;
@@ -170,52 +135,38 @@ static int8_t *compute_wNAF(const BIGNUM *scalar, int w, size_t *ret_len) {
170
135
  // for modified window NAFs, it may also be 2^w.
171
136
  if (window_val != 0 && window_val != next_bit && window_val != bit) {
172
137
  OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
173
- goto err;
138
+ return 0;
174
139
  }
175
140
  }
176
141
 
177
- r[j++] = sign * digit;
142
+ out[j++] = digit;
178
143
 
179
144
  window_val >>= 1;
180
- window_val += bit * BN_is_bit_set(scalar, j + w);
145
+ window_val +=
146
+ bit * bn_is_bit_set_words(scalar->words, group->order.width, j + w);
181
147
 
182
148
  if (window_val > next_bit) {
183
149
  OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
184
- goto err;
150
+ return 0;
185
151
  }
186
152
  }
187
153
 
188
- if (j > len + 1) {
154
+ // Fill the rest of the wNAF with zeros.
155
+ if (j > bits + 1) {
189
156
  OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
190
- goto err;
191
- }
192
- len = j;
193
- ok = 1;
194
-
195
- err:
196
- if (!ok) {
197
- OPENSSL_free(r);
198
- r = NULL;
157
+ return 0;
199
158
  }
200
- if (ok) {
201
- *ret_len = len;
159
+ for (size_t i = j; i < bits + 1; i++) {
160
+ out[i] = 0;
202
161
  }
203
- return r;
204
- }
205
162
 
163
+ return 1;
164
+ }
206
165
 
207
166
  // TODO: table should be optimised for the wNAF-based implementation,
208
167
  // sometimes smaller windows will give better performance
209
168
  // (thus the boundaries should be increased)
210
169
  static size_t window_bits_for_scalar_size(size_t b) {
211
- if (b >= 2000) {
212
- return 6;
213
- }
214
-
215
- if (b >= 800) {
216
- return 5;
217
- }
218
-
219
170
  if (b >= 300) {
220
171
  return 4;
221
172
  }
@@ -231,244 +182,173 @@ static size_t window_bits_for_scalar_size(size_t b) {
231
182
  return 1;
232
183
  }
233
184
 
234
- int ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r,
235
- const EC_SCALAR *g_scalar_raw, const EC_POINT *p,
236
- const EC_SCALAR *p_scalar_raw, BN_CTX *ctx) {
237
- BN_CTX *new_ctx = NULL;
238
- const EC_POINT *generator = NULL;
239
- EC_POINT *tmp = NULL;
240
- size_t total_num = 0;
241
- size_t i, j;
242
- int k;
243
- int r_is_inverted = 0;
244
- int r_is_at_infinity = 1;
245
- size_t *wsize = NULL; // individual window sizes
246
- int8_t **wNAF = NULL; // individual wNAFs
247
- size_t *wNAF_len = NULL;
248
- size_t max_len = 0;
249
- size_t num_val = 0;
250
- EC_POINT **val = NULL; // precomputation
251
- EC_POINT **v;
252
- EC_POINT ***val_sub = NULL; // pointers to sub-arrays of 'val'
253
- int ret = 0;
185
+ // EC_WNAF_MAX_WINDOW_BITS is the largest value returned by
186
+ // |window_bits_for_scalar_size|.
187
+ #define EC_WNAF_MAX_WINDOW_BITS 4
188
+
189
+ // compute_precomp sets |out[i]| to a newly-allocated |EC_POINT| containing
190
+ // (2*i+1)*p, for i from 0 to |len|. It returns one on success and
191
+ // zero on error.
192
+ static int compute_precomp(const EC_GROUP *group, EC_POINT **out,
193
+ const EC_POINT *p, size_t len, BN_CTX *ctx) {
194
+ out[0] = EC_POINT_new(group);
195
+ if (out[0] == NULL ||
196
+ !EC_POINT_copy(out[0], p)) {
197
+ return 0;
198
+ }
254
199
 
255
- if (ctx == NULL) {
256
- ctx = new_ctx = BN_CTX_new();
257
- if (ctx == NULL) {
258
- goto err;
259
- }
200
+ int ret = 0;
201
+ EC_POINT *two_p = EC_POINT_new(group);
202
+ if (two_p == NULL ||
203
+ !EC_POINT_dbl(group, two_p, p, ctx)) {
204
+ goto err;
260
205
  }
261
- BN_CTX_start(ctx);
262
-
263
- // Convert from |EC_SCALAR| to |BIGNUM|. |BIGNUM| is not constant-time, but
264
- // neither is the rest of this function.
265
- BIGNUM *g_scalar = NULL, *p_scalar = NULL;
266
- if (g_scalar_raw != NULL) {
267
- g_scalar = BN_CTX_get(ctx);
268
- if (g_scalar == NULL ||
269
- !bn_set_words(g_scalar, g_scalar_raw->words, group->order.top)) {
206
+
207
+ for (size_t i = 1; i < len; i++) {
208
+ out[i] = EC_POINT_new(group);
209
+ if (out[i] == NULL ||
210
+ !EC_POINT_add(group, out[i], out[i - 1], two_p, ctx)) {
270
211
  goto err;
271
212
  }
272
213
  }
273
- if (p_scalar_raw != NULL) {
274
- p_scalar = BN_CTX_get(ctx);
275
- if (p_scalar == NULL ||
276
- !bn_set_words(p_scalar, p_scalar_raw->words, group->order.top)) {
277
- goto err;
278
- }
214
+
215
+ ret = 1;
216
+
217
+ err:
218
+ EC_POINT_free(two_p);
219
+ return ret;
220
+ }
221
+
222
+ static int lookup_precomp(const EC_GROUP *group, EC_POINT *out,
223
+ EC_POINT *const *precomp, int digit, BN_CTX *ctx) {
224
+ if (digit < 0) {
225
+ digit = -digit;
226
+ return EC_POINT_copy(out, precomp[digit >> 1]) &&
227
+ EC_POINT_invert(group, out, ctx);
279
228
  }
280
229
 
281
- // TODO: This function used to take |points| and |scalars| as arrays of
282
- // |num| elements. The code below should be simplified to work in terms of |p|
283
- // and |p_scalar|.
284
- size_t num = p != NULL ? 1 : 0;
285
- const EC_POINT **points = p != NULL ? &p : NULL;
286
- BIGNUM **scalars = p != NULL ? &p_scalar : NULL;
230
+ return EC_POINT_copy(out, precomp[digit >> 1]);
231
+ }
287
232
 
288
- total_num = num;
233
+ int ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const EC_SCALAR *g_scalar,
234
+ const EC_POINT *p, const EC_SCALAR *p_scalar, BN_CTX *ctx) {
235
+ BN_CTX *new_ctx = NULL;
236
+ EC_POINT *precomp_storage[2 * (1 << (EC_WNAF_MAX_WINDOW_BITS - 1))] = {NULL};
237
+ EC_POINT **g_precomp = NULL, **p_precomp = NULL;
238
+ int8_t g_wNAF[EC_MAX_SCALAR_BYTES * 8 + 1];
239
+ int8_t p_wNAF[EC_MAX_SCALAR_BYTES * 8 + 1];
240
+ EC_POINT *tmp = NULL;
241
+ int ret = 0;
289
242
 
290
- if (g_scalar != NULL) {
291
- generator = EC_GROUP_get0_generator(group);
292
- if (generator == NULL) {
293
- OPENSSL_PUT_ERROR(EC, EC_R_UNDEFINED_GENERATOR);
243
+ if (ctx == NULL) {
244
+ ctx = new_ctx = BN_CTX_new();
245
+ if (ctx == NULL) {
294
246
  goto err;
295
247
  }
296
-
297
- ++total_num; // treat 'g_scalar' like 'num'-th element of 'scalars'
298
248
  }
299
249
 
250
+ size_t bits = BN_num_bits(&group->order);
251
+ size_t wsize = window_bits_for_scalar_size(bits);
252
+ size_t wNAF_len = bits + 1;
253
+ size_t precomp_len = (size_t)1 << (wsize - 1);
300
254
 
301
- wsize = OPENSSL_malloc(total_num * sizeof(wsize[0]));
302
- wNAF_len = OPENSSL_malloc(total_num * sizeof(wNAF_len[0]));
303
- wNAF = OPENSSL_malloc(total_num * sizeof(wNAF[0]));
304
- val_sub = OPENSSL_malloc(total_num * sizeof(val_sub[0]));
305
-
306
- // Ensure wNAF is initialised in case we end up going to err.
307
- if (wNAF != NULL) {
308
- OPENSSL_memset(wNAF, 0, total_num * sizeof(wNAF[0]));
309
- }
255
+ OPENSSL_COMPILE_ASSERT(
256
+ OPENSSL_ARRAY_SIZE(g_wNAF) == OPENSSL_ARRAY_SIZE(p_wNAF),
257
+ g_wNAF_and_p_wNAF_are_different_sizes);
310
258
 
311
- if (!wsize || !wNAF_len || !wNAF || !val_sub) {
312
- OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE);
259
+ if (wNAF_len > OPENSSL_ARRAY_SIZE(g_wNAF) ||
260
+ 2 * precomp_len > OPENSSL_ARRAY_SIZE(precomp_storage)) {
261
+ OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
313
262
  goto err;
314
263
  }
315
264
 
316
- // num_val will be the total number of temporarily precomputed points
317
- num_val = 0;
318
-
319
- for (i = 0; i < total_num; i++) {
320
- size_t bits;
321
-
322
- bits = i < num ? BN_num_bits(scalars[i]) : BN_num_bits(g_scalar);
323
- wsize[i] = window_bits_for_scalar_size(bits);
324
- num_val += (size_t)1 << (wsize[i] - 1);
325
- wNAF[i] =
326
- compute_wNAF((i < num ? scalars[i] : g_scalar), wsize[i], &wNAF_len[i]);
327
- if (wNAF[i] == NULL) {
265
+ // TODO(davidben): |mul_public| is for ECDSA verification which can assume
266
+ // non-NULL inputs, but this code is also used for |mul| which cannot. It's
267
+ // not constant-time, so replace the generic |mul| and remove the NULL checks.
268
+ size_t total_precomp = 0;
269
+ if (g_scalar != NULL) {
270
+ const EC_POINT *g = EC_GROUP_get0_generator(group);
271
+ if (g == NULL) {
272
+ OPENSSL_PUT_ERROR(EC, EC_R_UNDEFINED_GENERATOR);
328
273
  goto err;
329
274
  }
330
- if (wNAF_len[i] > max_len) {
331
- max_len = wNAF_len[i];
275
+ g_precomp = precomp_storage + total_precomp;
276
+ total_precomp += precomp_len;
277
+ if (!ec_compute_wNAF(group, g_wNAF, g_scalar, bits, wsize) ||
278
+ !compute_precomp(group, g_precomp, g, precomp_len, ctx)) {
279
+ goto err;
332
280
  }
333
281
  }
334
282
 
335
- // All points we precompute now go into a single array 'val'. 'val_sub[i]' is
336
- // a pointer to the subarray for the i-th point.
337
- val = OPENSSL_malloc(num_val * sizeof(val[0]));
338
- if (val == NULL) {
339
- OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE);
340
- goto err;
341
- }
342
- OPENSSL_memset(val, 0, num_val * sizeof(val[0]));
343
-
344
- // allocate points for precomputation
345
- v = val;
346
- for (i = 0; i < total_num; i++) {
347
- val_sub[i] = v;
348
- for (j = 0; j < ((size_t)1 << (wsize[i] - 1)); j++) {
349
- *v = EC_POINT_new(group);
350
- if (*v == NULL) {
351
- goto err;
352
- }
353
- v++;
283
+ if (p_scalar != NULL) {
284
+ p_precomp = precomp_storage + total_precomp;
285
+ total_precomp += precomp_len;
286
+ if (!ec_compute_wNAF(group, p_wNAF, p_scalar, bits, wsize) ||
287
+ !compute_precomp(group, p_precomp, p, precomp_len, ctx)) {
288
+ goto err;
354
289
  }
355
290
  }
356
- if (!(v == val + num_val)) {
357
- OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
358
- goto err;
359
- }
360
291
 
361
- if (!(tmp = EC_POINT_new(group))) {
292
+ tmp = EC_POINT_new(group);
293
+ if (tmp == NULL ||
294
+ // |window_bits_for_scalar_size| assumes we do this step.
295
+ !EC_POINTs_make_affine(group, total_precomp, precomp_storage, ctx)) {
362
296
  goto err;
363
297
  }
364
298
 
365
- // prepare precomputed values:
366
- // val_sub[i][0] := points[i]
367
- // val_sub[i][1] := 3 * points[i]
368
- // val_sub[i][2] := 5 * points[i]
369
- // ...
370
- for (i = 0; i < total_num; i++) {
371
- if (i < num) {
372
- if (!EC_POINT_copy(val_sub[i][0], points[i])) {
373
- goto err;
374
- }
375
- } else if (!EC_POINT_copy(val_sub[i][0], generator)) {
299
+ int r_is_at_infinity = 1;
300
+ for (size_t k = wNAF_len - 1; k < wNAF_len; k--) {
301
+ if (!r_is_at_infinity && !EC_POINT_dbl(group, r, r, ctx)) {
376
302
  goto err;
377
303
  }
378
304
 
379
- if (wsize[i] > 1) {
380
- if (!EC_POINT_dbl(group, tmp, val_sub[i][0], ctx)) {
381
- goto err;
382
- }
383
- for (j = 1; j < ((size_t)1 << (wsize[i] - 1)); j++) {
384
- if (!EC_POINT_add(group, val_sub[i][j], val_sub[i][j - 1], tmp, ctx)) {
305
+ if (g_scalar != NULL) {
306
+ if (g_wNAF[k] != 0) {
307
+ if (!lookup_precomp(group, tmp, g_precomp, g_wNAF[k], ctx)) {
308
+ goto err;
309
+ }
310
+ if (r_is_at_infinity) {
311
+ if (!EC_POINT_copy(r, tmp)) {
312
+ goto err;
313
+ }
314
+ r_is_at_infinity = 0;
315
+ } else if (!EC_POINT_add(group, r, r, tmp, ctx)) {
385
316
  goto err;
386
317
  }
387
318
  }
388
319
  }
389
- }
390
320
 
391
- #if 1 // optional; window_bits_for_scalar_size assumes we do this step
392
- if (!EC_POINTs_make_affine(group, num_val, val, ctx)) {
393
- goto err;
394
- }
395
- #endif
396
-
397
- r_is_at_infinity = 1;
398
-
399
- for (k = max_len - 1; k >= 0; k--) {
400
- if (!r_is_at_infinity && !EC_POINT_dbl(group, r, r, ctx)) {
401
- goto err;
402
- }
403
-
404
- for (i = 0; i < total_num; i++) {
405
- if (wNAF_len[i] > (size_t)k) {
406
- int digit = wNAF[i][k];
407
- int is_neg;
408
-
409
- if (digit) {
410
- is_neg = digit < 0;
411
-
412
- if (is_neg) {
413
- digit = -digit;
414
- }
415
-
416
- if (is_neg != r_is_inverted) {
417
- if (!r_is_at_infinity && !EC_POINT_invert(group, r, ctx)) {
418
- goto err;
419
- }
420
- r_is_inverted = !r_is_inverted;
421
- }
422
-
423
- // digit > 0
424
-
425
- if (r_is_at_infinity) {
426
- if (!EC_POINT_copy(r, val_sub[i][digit >> 1])) {
427
- goto err;
428
- }
429
- r_is_at_infinity = 0;
430
- } else {
431
- if (!EC_POINT_add(group, r, r, val_sub[i][digit >> 1], ctx)) {
432
- goto err;
433
- }
321
+ if (p_scalar != NULL) {
322
+ if (p_wNAF[k] != 0) {
323
+ if (!lookup_precomp(group, tmp, p_precomp, p_wNAF[k], ctx)) {
324
+ goto err;
325
+ }
326
+ if (r_is_at_infinity) {
327
+ if (!EC_POINT_copy(r, tmp)) {
328
+ goto err;
434
329
  }
330
+ r_is_at_infinity = 0;
331
+ } else if (!EC_POINT_add(group, r, r, tmp, ctx)) {
332
+ goto err;
435
333
  }
436
334
  }
437
335
  }
438
336
  }
439
337
 
440
- if (r_is_at_infinity) {
441
- if (!EC_POINT_set_to_infinity(group, r)) {
442
- goto err;
443
- }
444
- } else if (r_is_inverted && !EC_POINT_invert(group, r, ctx)) {
338
+ if (r_is_at_infinity &&
339
+ !EC_POINT_set_to_infinity(group, r)) {
445
340
  goto err;
446
341
  }
447
342
 
448
343
  ret = 1;
449
344
 
450
345
  err:
451
- if (ctx != NULL) {
452
- BN_CTX_end(ctx);
453
- }
454
346
  BN_CTX_free(new_ctx);
455
347
  EC_POINT_free(tmp);
456
- OPENSSL_free(wsize);
457
- OPENSSL_free(wNAF_len);
458
- if (wNAF != NULL) {
459
- for (i = 0; i < total_num; i++) {
460
- OPENSSL_free(wNAF[i]);
461
- }
462
-
463
- OPENSSL_free(wNAF);
464
- }
465
- if (val != NULL) {
466
- for (i = 0; i < num_val; i++) {
467
- EC_POINT_free(val[i]);
468
- }
469
-
470
- OPENSSL_free(val);
348
+ OPENSSL_cleanse(&g_wNAF, sizeof(g_wNAF));
349
+ OPENSSL_cleanse(&p_wNAF, sizeof(p_wNAF));
350
+ for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(precomp_storage); i++) {
351
+ EC_POINT_free(precomp_storage[i]);
471
352
  }
472
- OPENSSL_free(val_sub);
473
353
  return ret;
474
354
  }