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
@@ -71,7 +71,7 @@ uint64_t bn_mont_n0(const BIGNUM *n) {
71
71
  // |BN_MONT_CTX_N0_LIMBS| limbs of |n|.
72
72
  uint64_t n_mod_r = n->d[0];
73
73
  #if BN_MONT_CTX_N0_LIMBS == 2
74
- if (n->top > 1) {
74
+ if (n->width > 1) {
75
75
  n_mod_r |= (uint64_t)n->d[1] << BN_BITS2;
76
76
  }
77
77
  #endif
@@ -159,10 +159,8 @@ static uint64_t bn_neg_inv_mod_r_u64(uint64_t n) {
159
159
  return v;
160
160
  }
161
161
 
162
- // bn_mod_exp_base_2_vartime calculates r = 2**p (mod n). |p| must be larger
163
- // than log_2(n); i.e. 2**p must be larger than |n|. |n| must be positive and
164
- // odd.
165
- int bn_mod_exp_base_2_vartime(BIGNUM *r, unsigned p, const BIGNUM *n) {
162
+ int bn_mod_exp_base_2_consttime(BIGNUM *r, unsigned p, const BIGNUM *n,
163
+ BN_CTX *ctx) {
166
164
  assert(!BN_is_zero(n));
167
165
  assert(!BN_is_negative(n));
168
166
  assert(BN_is_odd(n));
@@ -171,37 +169,17 @@ int bn_mod_exp_base_2_vartime(BIGNUM *r, unsigned p, const BIGNUM *n) {
171
169
 
172
170
  unsigned n_bits = BN_num_bits(n);
173
171
  assert(n_bits != 0);
172
+ assert(p > n_bits);
174
173
  if (n_bits == 1) {
175
174
  return 1;
176
175
  }
177
176
 
178
- // Set |r| to the smallest power of two larger than |n|.
179
- assert(p > n_bits);
180
- if (!BN_set_bit(r, n_bits)) {
181
- return 0;
182
- }
183
-
184
- // Unconditionally reduce |r|.
185
- assert(BN_cmp(r, n) > 0);
186
- if (!BN_usub(r, r, n)) {
177
+ // Set |r| to the larger power of two smaller than |n|, then shift with
178
+ // reductions the rest of the way.
179
+ if (!BN_set_bit(r, n_bits - 1) ||
180
+ !bn_mod_lshift_consttime(r, r, p - (n_bits - 1), n, ctx)) {
187
181
  return 0;
188
182
  }
189
- assert(BN_cmp(r, n) < 0);
190
-
191
- for (unsigned i = n_bits; i < p; ++i) {
192
- // This is like |BN_mod_lshift1_quick| except using |BN_usub|.
193
- //
194
- // TODO: Replace this with the use of a constant-time variant of
195
- // |BN_mod_lshift1_quick|.
196
- if (!BN_lshift1(r, r)) {
197
- return 0;
198
- }
199
- if (BN_cmp(r, n) >= 0) {
200
- if (!BN_usub(r, r, n)) {
201
- return 0;
202
- }
203
- }
204
- }
205
183
 
206
184
  return 1;
207
185
  }
@@ -61,6 +61,7 @@
61
61
 
62
62
  #include <openssl/err.h>
63
63
  #include <openssl/mem.h>
64
+ #include <openssl/type_check.h>
64
65
 
65
66
  #include "internal.h"
66
67
  #include "../../internal.h"
@@ -70,6 +71,13 @@
70
71
  #define BN_SQR_RECURSIVE_SIZE_NORMAL BN_MUL_RECURSIVE_SIZE_NORMAL
71
72
 
72
73
 
74
+ static void bn_abs_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
75
+ size_t num, BN_ULONG *tmp) {
76
+ BN_ULONG borrow = bn_sub_words(tmp, a, b, num);
77
+ bn_sub_words(r, b, a, num);
78
+ bn_select_words(r, 0 - borrow, r /* tmp < 0 */, tmp /* tmp >= 0 */, num);
79
+ }
80
+
73
81
  static void bn_mul_normal(BN_ULONG *r, const BN_ULONG *a, size_t na,
74
82
  const BN_ULONG *b, size_t nb) {
75
83
  if (na < nb) {
@@ -279,25 +287,61 @@ BN_ULONG bn_sub_part_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
279
287
  int cl, int dl);
280
288
  #endif
281
289
 
290
+ // bn_abs_sub_part_words computes |r| = |a| - |b|, storing the absolute value
291
+ // and returning a mask of all ones if the result was negative and all zeros if
292
+ // the result was positive. |cl| and |dl| follow the |bn_sub_part_words| calling
293
+ // convention.
294
+ //
295
+ // TODO(davidben): Make this take |size_t|. The |cl| + |dl| calling convention
296
+ // is confusing. The trouble is 32-bit x86 implements |bn_sub_part_words| in
297
+ // assembly, but we can probably just delete it?
298
+ static BN_ULONG bn_abs_sub_part_words(BN_ULONG *r, const BN_ULONG *a,
299
+ const BN_ULONG *b, int cl, int dl,
300
+ BN_ULONG *tmp) {
301
+ BN_ULONG borrow = bn_sub_part_words(tmp, a, b, cl, dl);
302
+ bn_sub_part_words(r, b, a, cl, -dl);
303
+ int r_len = cl + (dl < 0 ? -dl : dl);
304
+ borrow = 0 - borrow;
305
+ bn_select_words(r, borrow, r /* tmp < 0 */, tmp /* tmp >= 0 */, r_len);
306
+ return borrow;
307
+ }
308
+
309
+ int bn_abs_sub_consttime(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
310
+ BN_CTX *ctx) {
311
+ int cl = a->width < b->width ? a->width : b->width;
312
+ int dl = a->width - b->width;
313
+ int r_len = a->width < b->width ? b->width : a->width;
314
+ BN_CTX_start(ctx);
315
+ BIGNUM *tmp = BN_CTX_get(ctx);
316
+ int ok = tmp != NULL &&
317
+ bn_wexpand(r, r_len) &&
318
+ bn_wexpand(tmp, r_len);
319
+ if (ok) {
320
+ bn_abs_sub_part_words(r->d, a->d, b->d, cl, dl, tmp->d);
321
+ r->width = r_len;
322
+ }
323
+ BN_CTX_end(ctx);
324
+ return ok;
325
+ }
326
+
282
327
  // Karatsuba recursive multiplication algorithm
283
328
  // (cf. Knuth, The Art of Computer Programming, Vol. 2)
284
329
 
285
- // r is 2*n2 words in size,
286
- // a and b are both n2 words in size.
287
- // n2 must be a power of 2.
288
- // We multiply and return the result.
289
- // t must be 2*n2 words in size
290
- // We calculate
291
- // a[0]*b[0]
292
- // a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
293
- // a[1]*b[1]
294
- // dnX may not be positive, but n2/2+dnX has to be
330
+ // bn_mul_recursive sets |r| to |a| * |b|, using |t| as scratch space. |r| has
331
+ // length 2*|n2|, |a| has length |n2| + |dna|, |b| has length |n2| + |dnb|, and
332
+ // |t| has length 4*|n2|. |n2| must be a power of two. Finally, we must have
333
+ // -|BN_MUL_RECURSIVE_SIZE_NORMAL|/2 <= |dna| <= 0 and
334
+ // -|BN_MUL_RECURSIVE_SIZE_NORMAL|/2 <= |dnb| <= 0.
335
+ //
336
+ // TODO(davidben): Simplify and |size_t| the calling convention around lengths
337
+ // here.
295
338
  static void bn_mul_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
296
339
  int n2, int dna, int dnb, BN_ULONG *t) {
297
- int n = n2 / 2, c1, c2;
298
- int tna = n + dna, tnb = n + dnb;
299
- unsigned int neg, zero;
300
- BN_ULONG ln, lo, *p;
340
+ // |n2| is a power of two.
341
+ assert(n2 != 0 && (n2 & (n2 - 1)) == 0);
342
+ // Check |dna| and |dnb| are in range.
343
+ assert(-BN_MUL_RECURSIVE_SIZE_NORMAL/2 <= dna && dna <= 0);
344
+ assert(-BN_MUL_RECURSIVE_SIZE_NORMAL/2 <= dnb && dnb <= 0);
301
345
 
302
346
  // Only call bn_mul_comba 8 if n2 == 8 and the
303
347
  // two arrays are complete [steve]
@@ -309,276 +353,212 @@ static void bn_mul_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
309
353
  // Else do normal multiply
310
354
  if (n2 < BN_MUL_RECURSIVE_SIZE_NORMAL) {
311
355
  bn_mul_normal(r, a, n2 + dna, b, n2 + dnb);
312
- if ((dna + dnb) < 0) {
356
+ if (dna + dnb < 0) {
313
357
  OPENSSL_memset(&r[2 * n2 + dna + dnb], 0,
314
358
  sizeof(BN_ULONG) * -(dna + dnb));
315
359
  }
316
360
  return;
317
361
  }
318
362
 
319
- // r=(a[0]-a[1])*(b[1]-b[0])
320
- c1 = bn_cmp_part_words(a, &(a[n]), tna, n - tna);
321
- c2 = bn_cmp_part_words(&(b[n]), b, tnb, tnb - n);
322
- zero = neg = 0;
323
- switch (c1 * 3 + c2) {
324
- case -4:
325
- bn_sub_part_words(t, &(a[n]), a, tna, tna - n); // -
326
- bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); // -
327
- break;
328
- case -3:
329
- zero = 1;
330
- break;
331
- case -2:
332
- bn_sub_part_words(t, &(a[n]), a, tna, tna - n); // -
333
- bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); // +
334
- neg = 1;
335
- break;
336
- case -1:
337
- case 0:
338
- case 1:
339
- zero = 1;
340
- break;
341
- case 2:
342
- bn_sub_part_words(t, a, &(a[n]), tna, n - tna); // +
343
- bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); // -
344
- neg = 1;
345
- break;
346
- case 3:
347
- zero = 1;
348
- break;
349
- case 4:
350
- bn_sub_part_words(t, a, &(a[n]), tna, n - tna);
351
- bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n);
352
- break;
353
- }
354
-
363
+ // Split |a| and |b| into a0,a1 and b0,b1, where a0 and b0 have size |n|.
364
+ // Split |t| into t0,t1,t2,t3, each of size |n|, with the remaining 4*|n| used
365
+ // for recursive calls.
366
+ // Split |r| into r0,r1,r2,r3. We must contribute a0*b0 to r0,r1, a0*a1+b0*b1
367
+ // to r1,r2, and a1*b1 to r2,r3. The middle term we will compute as:
368
+ //
369
+ // a0*a1 + b0*b1 = (a0 - a1)*(b1 - b0) + a1*b1 + a0*b0
370
+ //
371
+ // Note that we know |n| >= |BN_MUL_RECURSIVE_SIZE_NORMAL|/2 above, so
372
+ // |tna| and |tnb| are non-negative.
373
+ int n = n2 / 2, tna = n + dna, tnb = n + dnb;
374
+
375
+ // t0 = a0 - a1 and t1 = b1 - b0. The result will be multiplied, so we XOR
376
+ // their sign masks, giving the sign of (a0 - a1)*(b1 - b0). t0 and t1
377
+ // themselves store the absolute value.
378
+ BN_ULONG neg = bn_abs_sub_part_words(t, a, &a[n], tna, n - tna, &t[n2]);
379
+ neg ^= bn_abs_sub_part_words(&t[n], &b[n], b, tnb, tnb - n, &t[n2]);
380
+
381
+ // Compute:
382
+ // t2,t3 = t0 * t1 = |(a0 - a1)*(b1 - b0)|
383
+ // r0,r1 = a0 * b0
384
+ // r2,r3 = a1 * b1
355
385
  if (n == 4 && dna == 0 && dnb == 0) {
356
- // XXX: bn_mul_comba4 could take extra args to do this well
357
- if (!zero) {
358
- bn_mul_comba4(&(t[n2]), t, &(t[n]));
359
- } else {
360
- OPENSSL_memset(&(t[n2]), 0, 8 * sizeof(BN_ULONG));
361
- }
386
+ bn_mul_comba4(&t[n2], t, &t[n]);
362
387
 
363
388
  bn_mul_comba4(r, a, b);
364
- bn_mul_comba4(&(r[n2]), &(a[n]), &(b[n]));
389
+ bn_mul_comba4(&r[n2], &a[n], &b[n]);
365
390
  } else if (n == 8 && dna == 0 && dnb == 0) {
366
- // XXX: bn_mul_comba8 could take extra args to do this well
367
- if (!zero) {
368
- bn_mul_comba8(&(t[n2]), t, &(t[n]));
369
- } else {
370
- OPENSSL_memset(&(t[n2]), 0, 16 * sizeof(BN_ULONG));
371
- }
391
+ bn_mul_comba8(&t[n2], t, &t[n]);
372
392
 
373
393
  bn_mul_comba8(r, a, b);
374
- bn_mul_comba8(&(r[n2]), &(a[n]), &(b[n]));
394
+ bn_mul_comba8(&r[n2], &a[n], &b[n]);
375
395
  } else {
376
- p = &(t[n2 * 2]);
377
- if (!zero) {
378
- bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p);
379
- } else {
380
- OPENSSL_memset(&(t[n2]), 0, n2 * sizeof(BN_ULONG));
381
- }
396
+ BN_ULONG *p = &t[n2 * 2];
397
+ bn_mul_recursive(&t[n2], t, &t[n], n, 0, 0, p);
382
398
  bn_mul_recursive(r, a, b, n, 0, 0, p);
383
- bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), n, dna, dnb, p);
399
+ bn_mul_recursive(&r[n2], &a[n], &b[n], n, dna, dnb, p);
384
400
  }
385
401
 
386
- // t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign
387
- // r[10] holds (a[0]*b[0])
388
- // r[32] holds (b[1]*b[1])
402
+ // t0,t1,c = r0,r1 + r2,r3 = a0*b0 + a1*b1
403
+ BN_ULONG c = bn_add_words(t, r, &r[n2], n2);
389
404
 
390
- c1 = (int)(bn_add_words(t, r, &(r[n2]), n2));
405
+ // t2,t3,c = t0,t1,c + neg*t2,t3 = (a0 - a1)*(b1 - b0) + a1*b1 + a0*b0.
406
+ // The second term is stored as the absolute value, so we do this with a
407
+ // constant-time select.
408
+ BN_ULONG c_neg = c - bn_sub_words(&t[n2 * 2], t, &t[n2], n2);
409
+ BN_ULONG c_pos = c + bn_add_words(&t[n2], t, &t[n2], n2);
410
+ bn_select_words(&t[n2], neg, &t[n2 * 2], &t[n2], n2);
411
+ OPENSSL_COMPILE_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
412
+ crypto_word_t_too_small);
413
+ c = constant_time_select_w(neg, c_neg, c_pos);
391
414
 
392
- if (neg) {
393
- // if t[32] is negative
394
- c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2));
395
- } else {
396
- // Might have a carry
397
- c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2));
398
- }
399
-
400
- // t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1])
401
- // r[10] holds (a[0]*b[0])
402
- // r[32] holds (b[1]*b[1])
403
- // c1 holds the carry bits
404
- c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2));
405
- if (c1) {
406
- p = &(r[n + n2]);
407
- lo = *p;
408
- ln = lo + c1;
409
- *p = ln;
410
-
411
- // The overflow will stop before we over write
412
- // words we should not overwrite
413
- if (ln < (BN_ULONG)c1) {
414
- do {
415
- p++;
416
- lo = *p;
417
- ln = lo + 1;
418
- *p = ln;
419
- } while (ln == 0);
420
- }
415
+ // We now have our three components. Add them together.
416
+ // r1,r2,c = r1,r2 + t2,t3,c
417
+ c += bn_add_words(&r[n], &r[n], &t[n2], n2);
418
+
419
+ // Propagate the carry bit to the end.
420
+ for (int i = n + n2; i < n2 + n2; i++) {
421
+ BN_ULONG old = r[i];
422
+ r[i] = old + c;
423
+ c = r[i] < old;
421
424
  }
425
+
426
+ // The product should fit without carries.
427
+ assert(c == 0);
422
428
  }
423
429
 
424
- // n+tn is the word length
425
- // t needs to be n*4 is size, as does r
426
- // tnX may not be negative but less than n
430
+ // bn_mul_part_recursive sets |r| to |a| * |b|, using |t| as scratch space. |r|
431
+ // has length 4*|n|, |a| has length |n| + |tna|, |b| has length |n| + |tnb|, and
432
+ // |t| has length 8*|n|. |n| must be a power of two. Additionally, we must have
433
+ // 0 <= tna < n and 0 <= tnb < n, and |tna| and |tnb| must differ by at most
434
+ // one.
435
+ //
436
+ // TODO(davidben): Make this take |size_t| and perhaps the actual lengths of |a|
437
+ // and |b|.
427
438
  static void bn_mul_part_recursive(BN_ULONG *r, const BN_ULONG *a,
428
439
  const BN_ULONG *b, int n, int tna, int tnb,
429
440
  BN_ULONG *t) {
430
- int i, j, n2 = n * 2;
431
- int c1, c2, neg;
432
- BN_ULONG ln, lo, *p;
433
-
441
+ // |n| is a power of two.
442
+ assert(n != 0 && (n & (n - 1)) == 0);
443
+ // Check |tna| and |tnb| are in range.
444
+ assert(0 <= tna && tna < n);
445
+ assert(0 <= tnb && tnb < n);
446
+ assert(-1 <= tna - tnb && tna - tnb <= 1);
447
+
448
+ int n2 = n * 2;
434
449
  if (n < 8) {
435
450
  bn_mul_normal(r, a, n + tna, b, n + tnb);
451
+ OPENSSL_memset(r + n2 + tna + tnb, 0, n2 - tna - tnb);
436
452
  return;
437
453
  }
438
454
 
439
- // r=(a[0]-a[1])*(b[1]-b[0])
440
- c1 = bn_cmp_part_words(a, &(a[n]), tna, n - tna);
441
- c2 = bn_cmp_part_words(&(b[n]), b, tnb, tnb - n);
442
- neg = 0;
443
- switch (c1 * 3 + c2) {
444
- case -4:
445
- bn_sub_part_words(t, &(a[n]), a, tna, tna - n); // -
446
- bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); // -
447
- break;
448
- case -3:
449
- // break;
450
- case -2:
451
- bn_sub_part_words(t, &(a[n]), a, tna, tna - n); // -
452
- bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); // +
453
- neg = 1;
454
- break;
455
- case -1:
456
- case 0:
457
- case 1:
458
- // break;
459
- case 2:
460
- bn_sub_part_words(t, a, &(a[n]), tna, n - tna); // +
461
- bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); // -
462
- neg = 1;
463
- break;
464
- case 3:
465
- // break;
466
- case 4:
467
- bn_sub_part_words(t, a, &(a[n]), tna, n - tna);
468
- bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n);
469
- break;
470
- }
471
-
455
+ // Split |a| and |b| into a0,a1 and b0,b1, where a0 and b0 have size |n|. |a1|
456
+ // and |b1| have size |tna| and |tnb|, respectively.
457
+ // Split |t| into t0,t1,t2,t3, each of size |n|, with the remaining 4*|n| used
458
+ // for recursive calls.
459
+ // Split |r| into r0,r1,r2,r3. We must contribute a0*b0 to r0,r1, a0*a1+b0*b1
460
+ // to r1,r2, and a1*b1 to r2,r3. The middle term we will compute as:
461
+ //
462
+ // a0*a1 + b0*b1 = (a0 - a1)*(b1 - b0) + a1*b1 + a0*b0
463
+
464
+ // t0 = a0 - a1 and t1 = b1 - b0. The result will be multiplied, so we XOR
465
+ // their sign masks, giving the sign of (a0 - a1)*(b1 - b0). t0 and t1
466
+ // themselves store the absolute value.
467
+ BN_ULONG neg = bn_abs_sub_part_words(t, a, &a[n], tna, n - tna, &t[n2]);
468
+ neg ^= bn_abs_sub_part_words(&t[n], &b[n], b, tnb, tnb - n, &t[n2]);
469
+
470
+ // Compute:
471
+ // t2,t3 = t0 * t1 = |(a0 - a1)*(b1 - b0)|
472
+ // r0,r1 = a0 * b0
473
+ // r2,r3 = a1 * b1
472
474
  if (n == 8) {
473
- bn_mul_comba8(&(t[n2]), t, &(t[n]));
475
+ bn_mul_comba8(&t[n2], t, &t[n]);
474
476
  bn_mul_comba8(r, a, b);
475
- bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb);
476
- OPENSSL_memset(&(r[n2 + tna + tnb]), 0, sizeof(BN_ULONG) * (n2 - tna - tnb));
477
+
478
+ bn_mul_normal(&r[n2], &a[n], tna, &b[n], tnb);
479
+ // |bn_mul_normal| only writes |tna| + |tna| words. Zero the rest.
480
+ OPENSSL_memset(&r[n2 + tna + tnb], 0, sizeof(BN_ULONG) * (n2 - tna - tnb));
477
481
  } else {
478
- p = &(t[n2 * 2]);
479
- bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p);
482
+ BN_ULONG *p = &t[n2 * 2];
483
+ bn_mul_recursive(&t[n2], t, &t[n], n, 0, 0, p);
480
484
  bn_mul_recursive(r, a, b, n, 0, 0, p);
481
- i = n / 2;
482
- // If there is only a bottom half to the number,
483
- // just do it
484
- if (tna > tnb) {
485
- j = tna - i;
486
- } else {
487
- j = tnb - i;
488
- }
489
485
 
490
- if (j == 0) {
491
- bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), i, tna - i, tnb - i, p);
492
- OPENSSL_memset(&(r[n2 + i * 2]), 0, sizeof(BN_ULONG) * (n2 - i * 2));
493
- } else if (j > 0) {
494
- // eg, n == 16, i == 8 and tn == 11
495
- bn_mul_part_recursive(&(r[n2]), &(a[n]), &(b[n]), i, tna - i, tnb - i, p);
496
- OPENSSL_memset(&(r[n2 + tna + tnb]), 0,
497
- sizeof(BN_ULONG) * (n2 - tna - tnb));
486
+ OPENSSL_memset(&r[n2], 0, sizeof(BN_ULONG) * n2);
487
+ if (tna < BN_MUL_RECURSIVE_SIZE_NORMAL &&
488
+ tnb < BN_MUL_RECURSIVE_SIZE_NORMAL) {
489
+ bn_mul_normal(&r[n2], &a[n], tna, &b[n], tnb);
498
490
  } else {
499
- // (j < 0) eg, n == 16, i == 8 and tn == 5
500
- OPENSSL_memset(&(r[n2]), 0, sizeof(BN_ULONG) * n2);
501
- if (tna < BN_MUL_RECURSIVE_SIZE_NORMAL &&
502
- tnb < BN_MUL_RECURSIVE_SIZE_NORMAL) {
503
- bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb);
504
- } else {
505
- for (;;) {
506
- i /= 2;
507
- // these simplified conditions work
508
- // exclusively because difference
509
- // between tna and tnb is 1 or 0
510
- if (i < tna || i < tnb) {
511
- bn_mul_part_recursive(&(r[n2]), &(a[n]), &(b[n]), i, tna - i,
512
- tnb - i, p);
513
- break;
514
- } else if (i == tna || i == tnb) {
515
- bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), i, tna - i, tnb - i,
516
- p);
517
- break;
518
- }
491
+ int i = n;
492
+ for (;;) {
493
+ i /= 2;
494
+ if (i < tna || i < tnb) {
495
+ // E.g., n == 16, i == 8 and tna == 11. |tna| and |tnb| are within one
496
+ // of each other, so if |tna| is larger and tna > i, then we know
497
+ // tnb >= i, and this call is valid.
498
+ bn_mul_part_recursive(&r[n2], &a[n], &b[n], i, tna - i, tnb - i, p);
499
+ break;
519
500
  }
501
+ if (i == tna || i == tnb) {
502
+ // If there is only a bottom half to the number, just do it. We know
503
+ // the larger of |tna - i| and |tnb - i| is zero. The other is zero or
504
+ // -1 by because of |tna| and |tnb| differ by at most one.
505
+ bn_mul_recursive(&r[n2], &a[n], &b[n], i, tna - i, tnb - i, p);
506
+ break;
507
+ }
508
+
509
+ // This loop will eventually terminate when |i| falls below
510
+ // |BN_MUL_RECURSIVE_SIZE_NORMAL| because we know one of |tna| and |tnb|
511
+ // exceeds that.
520
512
  }
521
513
  }
522
514
  }
523
515
 
524
- // t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign
525
- // r[10] holds (a[0]*b[0])
526
- // r[32] holds (b[1]*b[1])
516
+ // t0,t1,c = r0,r1 + r2,r3 = a0*b0 + a1*b1
517
+ BN_ULONG c = bn_add_words(t, r, &r[n2], n2);
527
518
 
528
- c1 = (int)(bn_add_words(t, r, &(r[n2]), n2));
519
+ // t2,t3,c = t0,t1,c + neg*t2,t3 = (a0 - a1)*(b1 - b0) + a1*b1 + a0*b0.
520
+ // The second term is stored as the absolute value, so we do this with a
521
+ // constant-time select.
522
+ BN_ULONG c_neg = c - bn_sub_words(&t[n2 * 2], t, &t[n2], n2);
523
+ BN_ULONG c_pos = c + bn_add_words(&t[n2], t, &t[n2], n2);
524
+ bn_select_words(&t[n2], neg, &t[n2 * 2], &t[n2], n2);
525
+ OPENSSL_COMPILE_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
526
+ crypto_word_t_too_small);
527
+ c = constant_time_select_w(neg, c_neg, c_pos);
529
528
 
530
- if (neg) {
531
- // if t[32] is negative
532
- c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2));
533
- } else {
534
- // Might have a carry
535
- c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2));
536
- }
537
-
538
- // t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1])
539
- // r[10] holds (a[0]*b[0])
540
- // r[32] holds (b[1]*b[1])
541
- // c1 holds the carry bits
542
- c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2));
543
- if (c1) {
544
- p = &(r[n + n2]);
545
- lo = *p;
546
- ln = lo + c1;
547
- *p = ln;
548
-
549
- // The overflow will stop before we over write
550
- // words we should not overwrite
551
- if (ln < (BN_ULONG)c1) {
552
- do {
553
- p++;
554
- lo = *p;
555
- ln = lo + 1;
556
- *p = ln;
557
- } while (ln == 0);
558
- }
559
- }
560
- }
529
+ // We now have our three components. Add them together.
530
+ // r1,r2,c = r1,r2 + t2,t3,c
531
+ c += bn_add_words(&r[n], &r[n], &t[n2], n2);
561
532
 
562
- int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
563
- int ret = 0;
564
- int top, al, bl;
565
- BIGNUM *rr;
566
- int i;
567
- BIGNUM *t = NULL;
568
- int j = 0, k;
533
+ // Propagate the carry bit to the end.
534
+ for (int i = n + n2; i < n2 + n2; i++) {
535
+ BN_ULONG old = r[i];
536
+ r[i] = old + c;
537
+ c = r[i] < old;
538
+ }
569
539
 
570
- al = a->top;
571
- bl = b->top;
540
+ // The product should fit without carries.
541
+ assert(c == 0);
542
+ }
572
543
 
573
- if ((al == 0) || (bl == 0)) {
544
+ // bn_mul_impl implements |BN_mul| and |bn_mul_consttime|. Note this function
545
+ // breaks |BIGNUM| invariants and may return a negative zero. This is handled by
546
+ // the callers.
547
+ static int bn_mul_impl(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
548
+ BN_CTX *ctx) {
549
+ int al = a->width;
550
+ int bl = b->width;
551
+ if (al == 0 || bl == 0) {
574
552
  BN_zero(r);
575
553
  return 1;
576
554
  }
577
- top = al + bl;
578
555
 
556
+ int ret = 0;
557
+ BIGNUM *rr;
579
558
  BN_CTX_start(ctx);
580
- if ((r == a) || (r == b)) {
581
- if ((rr = BN_CTX_get(ctx)) == NULL) {
559
+ if (r == a || r == b) {
560
+ rr = BN_CTX_get(ctx);
561
+ if (r == NULL) {
582
562
  goto err;
583
563
  }
584
564
  } else {
@@ -586,55 +566,55 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
586
566
  }
587
567
  rr->neg = a->neg ^ b->neg;
588
568
 
589
- i = al - bl;
569
+ int i = al - bl;
590
570
  if (i == 0) {
591
571
  if (al == 8) {
592
572
  if (!bn_wexpand(rr, 16)) {
593
573
  goto err;
594
574
  }
595
- rr->top = 16;
575
+ rr->width = 16;
596
576
  bn_mul_comba8(rr->d, a->d, b->d);
597
577
  goto end;
598
578
  }
599
579
  }
600
580
 
581
+ int top = al + bl;
601
582
  static const int kMulNormalSize = 16;
602
583
  if (al >= kMulNormalSize && bl >= kMulNormalSize) {
603
- if (i >= -1 && i <= 1) {
604
- /* Find out the power of two lower or equal
605
- to the longest of the two numbers */
584
+ if (-1 <= i && i <= 1) {
585
+ // Find the larger power of two less than or equal to the larger length.
586
+ int j;
606
587
  if (i >= 0) {
607
588
  j = BN_num_bits_word((BN_ULONG)al);
608
- }
609
- if (i == -1) {
589
+ } else {
610
590
  j = BN_num_bits_word((BN_ULONG)bl);
611
591
  }
612
592
  j = 1 << (j - 1);
613
593
  assert(j <= al || j <= bl);
614
- k = j + j;
615
- t = BN_CTX_get(ctx);
594
+ BIGNUM *t = BN_CTX_get(ctx);
616
595
  if (t == NULL) {
617
596
  goto err;
618
597
  }
619
598
  if (al > j || bl > j) {
620
- if (!bn_wexpand(t, k * 4)) {
621
- goto err;
622
- }
623
- if (!bn_wexpand(rr, k * 4)) {
599
+ // We know |al| and |bl| are at most one from each other, so if al > j,
600
+ // bl >= j, and vice versa. Thus we can use |bn_mul_part_recursive|.
601
+ assert(al >= j && bl >= j);
602
+ if (!bn_wexpand(t, j * 8) ||
603
+ !bn_wexpand(rr, j * 4)) {
624
604
  goto err;
625
605
  }
626
606
  bn_mul_part_recursive(rr->d, a->d, b->d, j, al - j, bl - j, t->d);
627
607
  } else {
628
- // al <= j || bl <= j
629
- if (!bn_wexpand(t, k * 2)) {
630
- goto err;
631
- }
632
- if (!bn_wexpand(rr, k * 2)) {
608
+ // al <= j && bl <= j. Additionally, we know j <= al or j <= bl, so one
609
+ // of al - j or bl - j is zero. The other, by the bound on |i| above, is
610
+ // zero or -1. Thus, we can use |bn_mul_recursive|.
611
+ if (!bn_wexpand(t, j * 4) ||
612
+ !bn_wexpand(rr, j * 2)) {
633
613
  goto err;
634
614
  }
635
615
  bn_mul_recursive(rr->d, a->d, b->d, j, al - j, bl - j, t->d);
636
616
  }
637
- rr->top = top;
617
+ rr->width = top;
638
618
  goto end;
639
619
  }
640
620
  }
@@ -642,11 +622,10 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
642
622
  if (!bn_wexpand(rr, top)) {
643
623
  goto err;
644
624
  }
645
- rr->top = top;
625
+ rr->width = top;
646
626
  bn_mul_normal(rr->d, a->d, al, b->d, bl);
647
627
 
648
628
  end:
649
- bn_correct_top(rr);
650
629
  if (r != rr && !BN_copy(r, rr)) {
651
630
  goto err;
652
631
  }
@@ -657,6 +636,26 @@ err:
657
636
  return ret;
658
637
  }
659
638
 
639
+ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
640
+ if (!bn_mul_impl(r, a, b, ctx)) {
641
+ return 0;
642
+ }
643
+
644
+ // This additionally fixes any negative zeros created by |bn_mul_impl|.
645
+ bn_set_minimal_width(r);
646
+ return 1;
647
+ }
648
+
649
+ int bn_mul_consttime(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
650
+ // Prevent negative zeros.
651
+ if (a->neg || b->neg) {
652
+ OPENSSL_PUT_ERROR(BN, BN_R_NEGATIVE_NUMBER);
653
+ return 0;
654
+ }
655
+
656
+ return bn_mul_impl(r, a, b, ctx);
657
+ }
658
+
660
659
  int bn_mul_small(BN_ULONG *r, size_t num_r, const BN_ULONG *a, size_t num_a,
661
660
  const BN_ULONG *b, size_t num_b) {
662
661
  if (num_r != num_a + num_b) {
@@ -711,25 +710,19 @@ static void bn_sqr_normal(BN_ULONG *r, const BN_ULONG *a, size_t n,
711
710
  bn_add_words(r, r, tmp, max);
712
711
  }
713
712
 
714
- // r is 2*n words in size,
715
- // a and b are both n words in size. (There's not actually a 'b' here ...)
716
- // n must be a power of 2.
717
- // We multiply and return the result.
718
- // t must be 2*n words in size
719
- // We calculate
720
- // a[0]*b[0]
721
- // a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
722
- // a[1]*b[1]
723
- static void bn_sqr_recursive(BN_ULONG *r, const BN_ULONG *a, int n2,
713
+ // bn_sqr_recursive sets |r| to |a|^2, using |t| as scratch space. |r| has
714
+ // length 2*|n2|, |a| has length |n2|, and |t| has length 4*|n2|. |n2| must be
715
+ // a power of two.
716
+ static void bn_sqr_recursive(BN_ULONG *r, const BN_ULONG *a, size_t n2,
724
717
  BN_ULONG *t) {
725
- int n = n2 / 2;
726
- int zero, c1;
727
- BN_ULONG ln, lo, *p;
718
+ // |n2| is a power of two.
719
+ assert(n2 != 0 && (n2 & (n2 - 1)) == 0);
728
720
 
729
721
  if (n2 == 4) {
730
722
  bn_sqr_comba4(r, a);
731
723
  return;
732
- } else if (n2 == 8) {
724
+ }
725
+ if (n2 == 8) {
733
726
  bn_sqr_comba8(r, a);
734
727
  return;
735
728
  }
@@ -737,63 +730,48 @@ static void bn_sqr_recursive(BN_ULONG *r, const BN_ULONG *a, int n2,
737
730
  bn_sqr_normal(r, a, n2, t);
738
731
  return;
739
732
  }
740
- // r=(a[0]-a[1])*(a[1]-a[0])
741
- c1 = bn_cmp_words(a, &(a[n]), n);
742
- zero = 0;
743
- if (c1 > 0) {
744
- bn_sub_words(t, a, &(a[n]), n);
745
- } else if (c1 < 0) {
746
- bn_sub_words(t, &(a[n]), a, n);
747
- } else {
748
- zero = 1;
749
- }
750
733
 
751
- // The result will always be negative unless it is zero
752
- p = &(t[n2 * 2]);
734
+ // Split |a| into a0,a1, each of size |n|.
735
+ // Split |t| into t0,t1,t2,t3, each of size |n|, with the remaining 4*|n| used
736
+ // for recursive calls.
737
+ // Split |r| into r0,r1,r2,r3. We must contribute a0^2 to r0,r1, 2*a0*a1 to
738
+ // r1,r2, and a1^2 to r2,r3.
739
+ size_t n = n2 / 2;
740
+ BN_ULONG *t_recursive = &t[n2 * 2];
753
741
 
754
- if (!zero) {
755
- bn_sqr_recursive(&(t[n2]), t, n, p);
756
- } else {
757
- OPENSSL_memset(&(t[n2]), 0, n2 * sizeof(BN_ULONG));
758
- }
759
- bn_sqr_recursive(r, a, n, p);
760
- bn_sqr_recursive(&(r[n2]), &(a[n]), n, p);
761
-
762
- // t[32] holds (a[0]-a[1])*(a[1]-a[0]), it is negative or zero
763
- // r[10] holds (a[0]*b[0])
764
- // r[32] holds (b[1]*b[1])
765
-
766
- c1 = (int)(bn_add_words(t, r, &(r[n2]), n2));
767
-
768
- // t[32] is negative
769
- c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2));
770
-
771
- // t[32] holds (a[0]-a[1])*(a[1]-a[0])+(a[0]*a[0])+(a[1]*a[1])
772
- // r[10] holds (a[0]*a[0])
773
- // r[32] holds (a[1]*a[1])
774
- // c1 holds the carry bits
775
- c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2));
776
- if (c1) {
777
- p = &(r[n + n2]);
778
- lo = *p;
779
- ln = lo + c1;
780
- *p = ln;
781
-
782
- // The overflow will stop before we over write
783
- // words we should not overwrite
784
- if (ln < (BN_ULONG)c1) {
785
- do {
786
- p++;
787
- lo = *p;
788
- ln = lo + 1;
789
- *p = ln;
790
- } while (ln == 0);
791
- }
742
+ // t0 = |a0 - a1|.
743
+ bn_abs_sub_words(t, a, &a[n], n, &t[n]);
744
+ // t2,t3 = t0^2 = |a0 - a1|^2 = a0^2 - 2*a0*a1 + a1^2
745
+ bn_sqr_recursive(&t[n2], t, n, t_recursive);
746
+
747
+ // r0,r1 = a0^2
748
+ bn_sqr_recursive(r, a, n, t_recursive);
749
+
750
+ // r2,r3 = a1^2
751
+ bn_sqr_recursive(&r[n2], &a[n], n, t_recursive);
752
+
753
+ // t0,t1,c = r0,r1 + r2,r3 = a0^2 + a1^2
754
+ BN_ULONG c = bn_add_words(t, r, &r[n2], n2);
755
+ // t2,t3,c = t0,t1,c - t2,t3 = 2*a0*a1
756
+ c -= bn_sub_words(&t[n2], t, &t[n2], n2);
757
+
758
+ // We now have our three components. Add them together.
759
+ // r1,r2,c = r1,r2 + t2,t3,c
760
+ c += bn_add_words(&r[n], &r[n], &t[n2], n2);
761
+
762
+ // Propagate the carry bit to the end.
763
+ for (size_t i = n + n2; i < n2 + n2; i++) {
764
+ BN_ULONG old = r[i];
765
+ r[i] = old + c;
766
+ c = r[i] < old;
792
767
  }
768
+
769
+ // The square should fit without carries.
770
+ assert(c == 0);
793
771
  }
794
772
 
795
773
  int BN_mul_word(BIGNUM *bn, BN_ULONG w) {
796
- if (!bn->top) {
774
+ if (!bn->width) {
797
775
  return 1;
798
776
  }
799
777
 
@@ -802,37 +780,34 @@ int BN_mul_word(BIGNUM *bn, BN_ULONG w) {
802
780
  return 1;
803
781
  }
804
782
 
805
- BN_ULONG ll = bn_mul_words(bn->d, bn->d, bn->top, w);
783
+ BN_ULONG ll = bn_mul_words(bn->d, bn->d, bn->width, w);
806
784
  if (ll) {
807
- if (!bn_wexpand(bn, bn->top + 1)) {
785
+ if (!bn_wexpand(bn, bn->width + 1)) {
808
786
  return 0;
809
787
  }
810
- bn->d[bn->top++] = ll;
788
+ bn->d[bn->width++] = ll;
811
789
  }
812
790
 
813
791
  return 1;
814
792
  }
815
793
 
816
- int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) {
817
- int max, al;
818
- int ret = 0;
819
- BIGNUM *tmp, *rr;
820
-
821
- al = a->top;
794
+ int bn_sqr_consttime(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) {
795
+ int al = a->width;
822
796
  if (al <= 0) {
823
- r->top = 0;
797
+ r->width = 0;
824
798
  r->neg = 0;
825
799
  return 1;
826
800
  }
827
801
 
802
+ int ret = 0;
828
803
  BN_CTX_start(ctx);
829
- rr = (a != r) ? r : BN_CTX_get(ctx);
830
- tmp = BN_CTX_get(ctx);
804
+ BIGNUM *rr = (a != r) ? r : BN_CTX_get(ctx);
805
+ BIGNUM *tmp = BN_CTX_get(ctx);
831
806
  if (!rr || !tmp) {
832
807
  goto err;
833
808
  }
834
809
 
835
- max = 2 * al; // Non-zero (from above)
810
+ int max = 2 * al; // Non-zero (from above)
836
811
  if (!bn_wexpand(rr, max)) {
837
812
  goto err;
838
813
  }
@@ -846,13 +821,9 @@ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) {
846
821
  BN_ULONG t[BN_SQR_RECURSIVE_SIZE_NORMAL * 2];
847
822
  bn_sqr_normal(rr->d, a->d, al, t);
848
823
  } else {
849
- int j, k;
850
-
851
- j = BN_num_bits_word((BN_ULONG)al);
852
- j = 1 << (j - 1);
853
- k = j + j;
854
- if (al == j) {
855
- if (!bn_wexpand(tmp, k * 2)) {
824
+ // If |al| is a power of two, we can use |bn_sqr_recursive|.
825
+ if (al != 0 && (al & (al - 1)) == 0) {
826
+ if (!bn_wexpand(tmp, al * 4)) {
856
827
  goto err;
857
828
  }
858
829
  bn_sqr_recursive(rr->d, a->d, al, tmp->d);
@@ -866,13 +837,7 @@ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) {
866
837
  }
867
838
 
868
839
  rr->neg = 0;
869
- // If the most-significant half of the top word of 'a' is zero, then
870
- // the square of 'a' will max-1 words.
871
- if (a->d[al - 1] == (a->d[al - 1] & BN_MASK2l)) {
872
- rr->top = max - 1;
873
- } else {
874
- rr->top = max;
875
- }
840
+ rr->width = max;
876
841
 
877
842
  if (rr != r && !BN_copy(r, rr)) {
878
843
  goto err;
@@ -884,6 +849,15 @@ err:
884
849
  return ret;
885
850
  }
886
851
 
852
+ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) {
853
+ if (!bn_sqr_consttime(r, a, ctx)) {
854
+ return 0;
855
+ }
856
+
857
+ bn_set_minimal_width(r);
858
+ return 1;
859
+ }
860
+
887
861
  int bn_sqr_small(BN_ULONG *r, size_t num_r, const BN_ULONG *a, size_t num_a) {
888
862
  if (num_r != 2 * num_a || num_a > BN_SMALL_MAX_WORDS) {
889
863
  OPENSSL_PUT_ERROR(BN, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);