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
@@ -622,8 +622,8 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
622
622
 
623
623
  // Allocate a montgomery context if it was not supplied by the caller.
624
624
  if (mont == NULL) {
625
- new_mont = BN_MONT_CTX_new();
626
- if (new_mont == NULL || !BN_MONT_CTX_set(new_mont, m, ctx)) {
625
+ new_mont = BN_MONT_CTX_new_for_modulus(m, ctx);
626
+ if (new_mont == NULL) {
627
627
  goto err;
628
628
  }
629
629
  mont = new_mont;
@@ -666,22 +666,7 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
666
666
  }
667
667
  }
668
668
 
669
- // Set |r| to one in Montgomery form. If the high bit of |m| is set, |m| is
670
- // close to R and we subtract rather than perform Montgomery reduction.
671
- if (m->d[m->top - 1] & (((BN_ULONG)1) << (BN_BITS2 - 1))) {
672
- if (!bn_wexpand(r, m->top)) {
673
- goto err;
674
- }
675
- // r = 2^(top*BN_BITS2) - m
676
- r->d[0] = 0 - m->d[0];
677
- for (int i = 1; i < m->top; i++) {
678
- r->d[i] = ~m->d[i];
679
- }
680
- r->top = m->top;
681
- // The upper words will be zero if the corresponding words of |m| were
682
- // 0xfff[...], so call |bn_correct_top|.
683
- bn_correct_top(r);
684
- } else if (!BN_to_montgomery(r, BN_value_one(), mont, ctx)) {
669
+ if (!bn_one_to_montgomery(r, mont, ctx)) {
685
670
  goto err;
686
671
  }
687
672
 
@@ -746,8 +731,7 @@ err:
746
731
  int bn_mod_exp_mont_small(BN_ULONG *r, size_t num_r, const BN_ULONG *a,
747
732
  size_t num_a, const BN_ULONG *p, size_t num_p,
748
733
  const BN_MONT_CTX *mont) {
749
- const BN_ULONG *n = mont->N.d;
750
- size_t num_n = mont->N.top;
734
+ size_t num_n = mont->N.width;
751
735
  if (num_n != num_a || num_n != num_r || num_n > BN_SMALL_MAX_WORDS) {
752
736
  OPENSSL_PUT_ERROR(BN, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
753
737
  return 0;
@@ -793,16 +777,7 @@ int bn_mod_exp_mont_small(BN_ULONG *r, size_t num_r, const BN_ULONG *a,
793
777
  }
794
778
  }
795
779
 
796
- // Set |r| to one in Montgomery form. If the high bit of |m| is set, |m| is
797
- // close to R and we subtract rather than perform Montgomery reduction.
798
- if (n[num_n - 1] & (((BN_ULONG)1) << (BN_BITS2 - 1))) {
799
- // r = 2^(top*BN_BITS2) - m
800
- r[0] = 0 - n[0];
801
- for (size_t i = 1; i < num_n; i++) {
802
- r[i] = ~n[i];
803
- }
804
- } else if (!bn_from_montgomery_small(r, num_r, mont->RR.d, mont->RR.top,
805
- mont)) {
780
+ if (!bn_one_to_montgomery_small(r, num_r, mont)) {
806
781
  goto err;
807
782
  }
808
783
 
@@ -866,7 +841,7 @@ int bn_mod_inverse_prime_mont_small(BN_ULONG *r, size_t num_r,
866
841
  const BN_ULONG *a, size_t num_a,
867
842
  const BN_MONT_CTX *mont) {
868
843
  const BN_ULONG *p = mont->N.d;
869
- size_t num_p = mont->N.top;
844
+ size_t num_p = mont->N.width;
870
845
  if (num_p > BN_SMALL_MAX_WORDS || num_p == 0) {
871
846
  OPENSSL_PUT_ERROR(BN, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
872
847
  return 0;
@@ -901,8 +876,8 @@ static void copy_to_prebuf(const BIGNUM *b, int top, unsigned char *buf,
901
876
  const int width = 1 << window;
902
877
  BN_ULONG *table = (BN_ULONG *) buf;
903
878
 
904
- if (top > b->top) {
905
- top = b->top; // this works because 'buf' is explicitly zeroed
879
+ if (top > b->width) {
880
+ top = b->width; // this works because 'buf' is explicitly zeroed
906
881
  }
907
882
 
908
883
  for (i = 0, j = idx; i < top; i++, j += width) {
@@ -955,8 +930,7 @@ static int copy_from_prebuf(BIGNUM *b, int top, unsigned char *buf, int idx,
955
930
  }
956
931
  }
957
932
 
958
- b->top = top;
959
- bn_correct_top(b);
933
+ b->width = top;
960
934
  return 1;
961
935
  }
962
936
 
@@ -1006,8 +980,7 @@ static int copy_from_prebuf(BIGNUM *b, int top, unsigned char *buf, int idx,
1006
980
  int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
1007
981
  const BIGNUM *m, BN_CTX *ctx,
1008
982
  const BN_MONT_CTX *mont) {
1009
- int i, bits, ret = 0, window, wvalue;
1010
- int top;
983
+ int i, ret = 0, window, wvalue;
1011
984
  BN_MONT_CTX *new_mont = NULL;
1012
985
 
1013
986
  int numPowers;
@@ -1022,9 +995,10 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
1022
995
  return 0;
1023
996
  }
1024
997
 
1025
- top = m->top;
1026
-
1027
- bits = BN_num_bits(p);
998
+ // Use all bits stored in |p|, rather than |BN_num_bits|, so we do not leak
999
+ // whether the top bits are zero.
1000
+ int max_bits = p->width * BN_BITS2;
1001
+ int bits = max_bits;
1028
1002
  if (bits == 0) {
1029
1003
  // x**0 mod 1 is still zero.
1030
1004
  if (BN_is_one(m)) {
@@ -1036,13 +1010,17 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
1036
1010
 
1037
1011
  // Allocate a montgomery context if it was not supplied by the caller.
1038
1012
  if (mont == NULL) {
1039
- new_mont = BN_MONT_CTX_new();
1040
- if (new_mont == NULL || !BN_MONT_CTX_set(new_mont, m, ctx)) {
1013
+ new_mont = BN_MONT_CTX_new_for_modulus(m, ctx);
1014
+ if (new_mont == NULL) {
1041
1015
  goto err;
1042
1016
  }
1043
1017
  mont = new_mont;
1044
1018
  }
1045
1019
 
1020
+ // Use the width in |mont->N|, rather than the copy in |m|. The assembly
1021
+ // implementation assumes it can use |top| to size R.
1022
+ int top = mont->N.width;
1023
+
1046
1024
  if (a->neg || BN_ucmp(a, m) >= 0) {
1047
1025
  new_a = BN_new();
1048
1026
  if (new_a == NULL ||
@@ -1056,15 +1034,14 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
1056
1034
  // If the size of the operands allow it, perform the optimized
1057
1035
  // RSAZ exponentiation. For further information see
1058
1036
  // crypto/bn/rsaz_exp.c and accompanying assembly modules.
1059
- if ((16 == a->top) && (16 == p->top) && (BN_num_bits(m) == 1024) &&
1037
+ if ((16 == a->width) && (16 == p->width) && (BN_num_bits(m) == 1024) &&
1060
1038
  rsaz_avx2_eligible()) {
1061
1039
  if (!bn_wexpand(rr, 16)) {
1062
1040
  goto err;
1063
1041
  }
1064
1042
  RSAZ_1024_mod_exp_avx2(rr->d, a->d, p->d, m->d, mont->RR.d, mont->n0[0]);
1065
- rr->top = 16;
1043
+ rr->width = 16;
1066
1044
  rr->neg = 0;
1067
- bn_correct_top(rr);
1068
1045
  ret = 1;
1069
1046
  goto err;
1070
1047
  }
@@ -1110,21 +1087,12 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
1110
1087
  // lay down tmp and am right after powers table
1111
1088
  tmp.d = (BN_ULONG *)(powerbuf + sizeof(m->d[0]) * top * numPowers);
1112
1089
  am.d = tmp.d + top;
1113
- tmp.top = am.top = 0;
1090
+ tmp.width = am.width = 0;
1114
1091
  tmp.dmax = am.dmax = top;
1115
1092
  tmp.neg = am.neg = 0;
1116
1093
  tmp.flags = am.flags = BN_FLG_STATIC_DATA;
1117
1094
 
1118
- // prepare a^0 in Montgomery domain
1119
- // by Shay Gueron's suggestion
1120
- if (m->d[top - 1] & (((BN_ULONG)1) << (BN_BITS2 - 1))) {
1121
- // 2^(top*BN_BITS2) - m
1122
- tmp.d[0] = 0 - m->d[0];
1123
- for (i = 1; i < top; i++) {
1124
- tmp.d[i] = ~m->d[i];
1125
- }
1126
- tmp.top = top;
1127
- } else if (!BN_to_montgomery(&tmp, BN_value_one(), mont, ctx)) {
1095
+ if (!bn_one_to_montgomery(&tmp, mont, ctx)) {
1128
1096
  goto err;
1129
1097
  }
1130
1098
 
@@ -1148,10 +1116,10 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
1148
1116
 
1149
1117
  // BN_to_montgomery can contaminate words above .top
1150
1118
  // [in BN_DEBUG[_DEBUG] build]...
1151
- for (i = am.top; i < top; i++) {
1119
+ for (i = am.width; i < top; i++) {
1152
1120
  am.d[i] = 0;
1153
1121
  }
1154
- for (i = tmp.top; i < top; i++) {
1122
+ for (i = tmp.width; i < top; i++) {
1155
1123
  tmp.d[i] = 0;
1156
1124
  }
1157
1125
 
@@ -1161,7 +1129,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
1161
1129
  }
1162
1130
 
1163
1131
  bn_scatter5(tmp.d, top, powerbuf, 0);
1164
- bn_scatter5(am.d, am.top, powerbuf, 1);
1132
+ bn_scatter5(am.d, am.width, powerbuf, 1);
1165
1133
  bn_mul_mont(tmp.d, am.d, am.d, np, n0, top);
1166
1134
  bn_scatter5(tmp.d, top, powerbuf, 2);
1167
1135
 
@@ -1217,7 +1185,6 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
1217
1185
  }
1218
1186
  } else {
1219
1187
  const uint8_t *p_bytes = (const uint8_t *)p->d;
1220
- int max_bits = p->top * BN_BITS2;
1221
1188
  assert(bits < max_bits);
1222
1189
  // |p = 0| has been handled as a special case, so |max_bits| is at least
1223
1190
  // one word.
@@ -1229,7 +1196,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
1229
1196
  // here is the top bit, inclusive.
1230
1197
  if (bits - 4 >= max_bits - 8) {
1231
1198
  // Read five bits from |bits-4| through |bits|, inclusive.
1232
- wvalue = p_bytes[p->top * BN_BYTES - 1];
1199
+ wvalue = p_bytes[p->width * BN_BYTES - 1];
1233
1200
  wvalue >>= (bits - 4) & 7;
1234
1201
  wvalue &= 0x1f;
1235
1202
  bits -= 5;
@@ -1248,8 +1215,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
1248
1215
  }
1249
1216
 
1250
1217
  ret = bn_from_montgomery(tmp.d, tmp.d, NULL, np, n0, top);
1251
- tmp.top = top;
1252
- bn_correct_top(&tmp);
1218
+ tmp.width = top;
1253
1219
  if (ret) {
1254
1220
  if (!BN_copy(rr, &tmp)) {
1255
1221
  ret = 0;
@@ -1363,8 +1329,8 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1,
1363
1329
 
1364
1330
  // Allocate a montgomery context if it was not supplied by the caller.
1365
1331
  if (mont == NULL) {
1366
- new_mont = BN_MONT_CTX_new();
1367
- if (new_mont == NULL || !BN_MONT_CTX_set(new_mont, m, ctx)) {
1332
+ new_mont = BN_MONT_CTX_new_for_modulus(m, ctx);
1333
+ if (new_mont == NULL) {
1368
1334
  goto err;
1369
1335
  }
1370
1336
  mont = new_mont;
@@ -114,121 +114,310 @@
114
114
 
115
115
  #include "internal.h"
116
116
 
117
- static BIGNUM *euclid(BIGNUM *a, BIGNUM *b) {
118
- BIGNUM *t;
119
- int shifts = 0;
120
117
 
121
- // 0 <= b <= a
122
- while (!BN_is_zero(b)) {
123
- // 0 < b <= a
118
+ static BN_ULONG word_is_odd_mask(BN_ULONG a) { return (BN_ULONG)0 - (a & 1); }
124
119
 
125
- if (BN_is_odd(a)) {
126
- if (BN_is_odd(b)) {
127
- if (!BN_sub(a, a, b)) {
128
- goto err;
129
- }
130
- if (!BN_rshift1(a, a)) {
131
- goto err;
132
- }
133
- if (BN_cmp(a, b) < 0) {
134
- t = a;
135
- a = b;
136
- b = t;
137
- }
138
- } else {
139
- // a odd - b even
140
- if (!BN_rshift1(b, b)) {
141
- goto err;
142
- }
143
- if (BN_cmp(a, b) < 0) {
144
- t = a;
145
- a = b;
146
- b = t;
147
- }
148
- }
149
- } else {
150
- // a is even
151
- if (BN_is_odd(b)) {
152
- if (!BN_rshift1(a, a)) {
153
- goto err;
154
- }
155
- if (BN_cmp(a, b) < 0) {
156
- t = a;
157
- a = b;
158
- b = t;
159
- }
160
- } else {
161
- // a even - b even
162
- if (!BN_rshift1(a, a)) {
163
- goto err;
164
- }
165
- if (!BN_rshift1(b, b)) {
166
- goto err;
167
- }
168
- shifts++;
169
- }
170
- }
171
- // 0 <= b <= a
120
+ static void maybe_rshift1_words(BN_ULONG *a, BN_ULONG mask, BN_ULONG *tmp,
121
+ size_t num) {
122
+ bn_rshift1_words(tmp, a, num);
123
+ bn_select_words(a, mask, tmp, a, num);
124
+ }
125
+
126
+ static void maybe_rshift1_words_carry(BN_ULONG *a, BN_ULONG carry,
127
+ BN_ULONG mask, BN_ULONG *tmp,
128
+ size_t num) {
129
+ maybe_rshift1_words(a, mask, tmp, num);
130
+ if (num != 0) {
131
+ carry &= mask;
132
+ a[num - 1] |= carry << (BN_BITS2-1);
133
+ }
134
+ }
135
+
136
+ static BN_ULONG maybe_add_words(BN_ULONG *a, BN_ULONG mask, const BN_ULONG *b,
137
+ BN_ULONG *tmp, size_t num) {
138
+ BN_ULONG carry = bn_add_words(tmp, a, b, num);
139
+ bn_select_words(a, mask, tmp, a, num);
140
+ return carry & mask;
141
+ }
142
+
143
+ static int bn_gcd_consttime(BIGNUM *r, unsigned *out_shift, const BIGNUM *x,
144
+ const BIGNUM *y, BN_CTX *ctx) {
145
+ size_t width = x->width > y->width ? x->width : y->width;
146
+ if (width == 0) {
147
+ *out_shift = 0;
148
+ BN_zero(r);
149
+ return 1;
172
150
  }
173
151
 
174
- if (shifts) {
175
- if (!BN_lshift(a, a, shifts)) {
176
- goto err;
177
- }
152
+ // This is a constant-time implementation of Stein's algorithm (binary GCD).
153
+ int ret = 0;
154
+ BN_CTX_start(ctx);
155
+ BIGNUM *u = BN_CTX_get(ctx);
156
+ BIGNUM *v = BN_CTX_get(ctx);
157
+ BIGNUM *tmp = BN_CTX_get(ctx);
158
+ if (u == NULL || v == NULL || tmp == NULL ||
159
+ !BN_copy(u, x) ||
160
+ !BN_copy(v, y) ||
161
+ !bn_resize_words(u, width) ||
162
+ !bn_resize_words(v, width) ||
163
+ !bn_resize_words(tmp, width)) {
164
+ goto err;
165
+ }
166
+
167
+ // Each loop iteration halves at least one of |u| and |v|. Thus we need at
168
+ // most the combined bit width of inputs for at least one value to be zero.
169
+ unsigned x_bits = x->width * BN_BITS2, y_bits = y->width * BN_BITS2;
170
+ unsigned num_iters = x_bits + y_bits;
171
+ if (num_iters < x_bits) {
172
+ OPENSSL_PUT_ERROR(BN, BN_R_BIGNUM_TOO_LONG);
173
+ goto err;
178
174
  }
179
175
 
180
- return a;
176
+ unsigned shift = 0;
177
+ for (unsigned i = 0; i < num_iters; i++) {
178
+ BN_ULONG both_odd = word_is_odd_mask(u->d[0]) & word_is_odd_mask(v->d[0]);
179
+
180
+ // If both |u| and |v| are odd, subtract the smaller from the larger.
181
+ BN_ULONG u_less_than_v =
182
+ (BN_ULONG)0 - bn_sub_words(tmp->d, u->d, v->d, width);
183
+ bn_select_words(u->d, both_odd & ~u_less_than_v, tmp->d, u->d, width);
184
+ bn_sub_words(tmp->d, v->d, u->d, width);
185
+ bn_select_words(v->d, both_odd & u_less_than_v, tmp->d, v->d, width);
186
+
187
+ // At least one of |u| and |v| is now even.
188
+ BN_ULONG u_is_odd = word_is_odd_mask(u->d[0]);
189
+ BN_ULONG v_is_odd = word_is_odd_mask(v->d[0]);
190
+ assert(!(u_is_odd & v_is_odd));
191
+
192
+ // If both are even, the final GCD gains a factor of two.
193
+ shift += 1 & (~u_is_odd & ~v_is_odd);
194
+
195
+ // Halve any which are even.
196
+ maybe_rshift1_words(u->d, ~u_is_odd, tmp->d, width);
197
+ maybe_rshift1_words(v->d, ~v_is_odd, tmp->d, width);
198
+ }
199
+
200
+ // One of |u| or |v| is zero at this point. The algorithm usually makes |u|
201
+ // zero, unless |y| was already zero on input. Fix this by combining the
202
+ // values.
203
+ assert(BN_is_zero(u) || BN_is_zero(v));
204
+ for (size_t i = 0; i < width; i++) {
205
+ v->d[i] |= u->d[i];
206
+ }
207
+
208
+ *out_shift = shift;
209
+ ret = bn_set_words(r, v->d, width);
181
210
 
182
211
  err:
183
- return NULL;
212
+ BN_CTX_end(ctx);
213
+ return ret;
184
214
  }
185
215
 
186
- int BN_gcd(BIGNUM *r, const BIGNUM *in_a, const BIGNUM *in_b, BN_CTX *ctx) {
187
- BIGNUM *a, *b, *t;
216
+ int BN_gcd(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx) {
217
+ unsigned shift;
218
+ return bn_gcd_consttime(r, &shift, x, y, ctx) &&
219
+ BN_lshift(r, r, shift);
220
+ }
221
+
222
+ int bn_is_relatively_prime(int *out_relatively_prime, const BIGNUM *x,
223
+ const BIGNUM *y, BN_CTX *ctx) {
188
224
  int ret = 0;
225
+ BN_CTX_start(ctx);
226
+ unsigned shift;
227
+ BIGNUM *gcd = BN_CTX_get(ctx);
228
+ if (gcd == NULL ||
229
+ !bn_gcd_consttime(gcd, &shift, x, y, ctx)) {
230
+ goto err;
231
+ }
232
+
233
+ // Check that 2^|shift| * |gcd| is one.
234
+ if (gcd->width == 0) {
235
+ *out_relatively_prime = 0;
236
+ } else {
237
+ BN_ULONG mask = shift | (gcd->d[0] ^ 1);
238
+ for (int i = 1; i < gcd->width; i++) {
239
+ mask |= gcd->d[i];
240
+ }
241
+ *out_relatively_prime = mask == 0;
242
+ }
243
+ ret = 1;
244
+
245
+ err:
246
+ BN_CTX_end(ctx);
247
+ return ret;
248
+ }
189
249
 
250
+ int bn_lcm_consttime(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
190
251
  BN_CTX_start(ctx);
191
- a = BN_CTX_get(ctx);
192
- b = BN_CTX_get(ctx);
252
+ unsigned shift;
253
+ BIGNUM *gcd = BN_CTX_get(ctx);
254
+ int ret = gcd != NULL &&
255
+ bn_mul_consttime(r, a, b, ctx) &&
256
+ bn_gcd_consttime(gcd, &shift, a, b, ctx) &&
257
+ bn_div_consttime(r, NULL, r, gcd, ctx) &&
258
+ bn_rshift_secret_shift(r, r, shift, ctx);
259
+ BN_CTX_end(ctx);
260
+ return ret;
261
+ }
193
262
 
194
- if (a == NULL || b == NULL) {
195
- goto err;
263
+ int bn_mod_inverse_consttime(BIGNUM *r, int *out_no_inverse, const BIGNUM *a,
264
+ const BIGNUM *n, BN_CTX *ctx) {
265
+ *out_no_inverse = 0;
266
+ if (BN_is_negative(a) || BN_ucmp(a, n) >= 0) {
267
+ OPENSSL_PUT_ERROR(BN, BN_R_INPUT_NOT_REDUCED);
268
+ return 0;
196
269
  }
197
- if (BN_copy(a, in_a) == NULL) {
198
- goto err;
270
+ if (BN_is_zero(a)) {
271
+ if (BN_is_one(n)) {
272
+ BN_zero(r);
273
+ return 1;
274
+ }
275
+ *out_no_inverse = 1;
276
+ OPENSSL_PUT_ERROR(BN, BN_R_NO_INVERSE);
277
+ return 0;
199
278
  }
200
- if (BN_copy(b, in_b) == NULL) {
201
- goto err;
279
+
280
+ // This is a constant-time implementation of the extended binary GCD
281
+ // algorithm. It is adapted from the Handbook of Applied Cryptography, section
282
+ // 14.4.3, algorithm 14.51, and modified to bound coefficients and avoid
283
+ // negative numbers.
284
+ //
285
+ // For more details and proof of correctness, see
286
+ // https://github.com/mit-plv/fiat-crypto/pull/333. In particular, see |step|
287
+ // and |mod_inverse_consttime| for the algorithm in Gallina and see
288
+ // |mod_inverse_consttime_spec| for the correctness result.
289
+
290
+ if (!BN_is_odd(a) && !BN_is_odd(n)) {
291
+ *out_no_inverse = 1;
292
+ OPENSSL_PUT_ERROR(BN, BN_R_NO_INVERSE);
293
+ return 0;
202
294
  }
203
295
 
204
- a->neg = 0;
205
- b->neg = 0;
296
+ // This function exists to compute the RSA private exponent, where |a| is one
297
+ // word. We'll thus use |a_width| when available.
298
+ size_t n_width = n->width, a_width = a->width;
299
+ if (a_width > n_width) {
300
+ a_width = n_width;
301
+ }
206
302
 
207
- if (BN_cmp(a, b) < 0) {
208
- t = a;
209
- a = b;
210
- b = t;
303
+ int ret = 0;
304
+ BN_CTX_start(ctx);
305
+ BIGNUM *u = BN_CTX_get(ctx);
306
+ BIGNUM *v = BN_CTX_get(ctx);
307
+ BIGNUM *A = BN_CTX_get(ctx);
308
+ BIGNUM *B = BN_CTX_get(ctx);
309
+ BIGNUM *C = BN_CTX_get(ctx);
310
+ BIGNUM *D = BN_CTX_get(ctx);
311
+ BIGNUM *tmp = BN_CTX_get(ctx);
312
+ BIGNUM *tmp2 = BN_CTX_get(ctx);
313
+ if (u == NULL || v == NULL || A == NULL || B == NULL || C == NULL ||
314
+ D == NULL || tmp == NULL || tmp2 == NULL ||
315
+ !BN_copy(u, a) ||
316
+ !BN_copy(v, n) ||
317
+ !BN_one(A) ||
318
+ !BN_one(D) ||
319
+ // For convenience, size |u| and |v| equivalently.
320
+ !bn_resize_words(u, n_width) ||
321
+ !bn_resize_words(v, n_width) ||
322
+ // |A| and |C| are bounded by |m|.
323
+ !bn_resize_words(A, n_width) ||
324
+ !bn_resize_words(C, n_width) ||
325
+ // |B| and |D| are bounded by |a|.
326
+ !bn_resize_words(B, a_width) ||
327
+ !bn_resize_words(D, a_width) ||
328
+ // |tmp| and |tmp2| may be used at either size.
329
+ !bn_resize_words(tmp, n_width) ||
330
+ !bn_resize_words(tmp2, n_width)) {
331
+ goto err;
211
332
  }
212
- t = euclid(a, b);
213
- if (t == NULL) {
333
+
334
+ // Each loop iteration halves at least one of |u| and |v|. Thus we need at
335
+ // most the combined bit width of inputs for at least one value to be zero.
336
+ unsigned a_bits = a_width * BN_BITS2, n_bits = n_width * BN_BITS2;
337
+ unsigned num_iters = a_bits + n_bits;
338
+ if (num_iters < a_bits) {
339
+ OPENSSL_PUT_ERROR(BN, BN_R_BIGNUM_TOO_LONG);
214
340
  goto err;
215
341
  }
216
342
 
217
- if (BN_copy(r, t) == NULL) {
343
+ // Before and after each loop iteration, the following hold:
344
+ //
345
+ // u = A*a - B*n
346
+ // v = D*n - C*a
347
+ // 0 < u <= a
348
+ // 0 <= v <= n
349
+ // 0 <= A < n
350
+ // 0 <= B <= a
351
+ // 0 <= C < n
352
+ // 0 <= D <= a
353
+ //
354
+ // After each loop iteration, u and v only get smaller, and at least one of
355
+ // them shrinks by at least a factor of two.
356
+ for (unsigned i = 0; i < num_iters; i++) {
357
+ BN_ULONG both_odd = word_is_odd_mask(u->d[0]) & word_is_odd_mask(v->d[0]);
358
+
359
+ // If both |u| and |v| are odd, subtract the smaller from the larger.
360
+ BN_ULONG v_less_than_u =
361
+ (BN_ULONG)0 - bn_sub_words(tmp->d, v->d, u->d, n_width);
362
+ bn_select_words(v->d, both_odd & ~v_less_than_u, tmp->d, v->d, n_width);
363
+ bn_sub_words(tmp->d, u->d, v->d, n_width);
364
+ bn_select_words(u->d, both_odd & v_less_than_u, tmp->d, u->d, n_width);
365
+
366
+ // If we updated one of the values, update the corresponding coefficient.
367
+ BN_ULONG carry = bn_add_words(tmp->d, A->d, C->d, n_width);
368
+ carry -= bn_sub_words(tmp2->d, tmp->d, n->d, n_width);
369
+ bn_select_words(tmp->d, carry, tmp->d, tmp2->d, n_width);
370
+ bn_select_words(A->d, both_odd & v_less_than_u, tmp->d, A->d, n_width);
371
+ bn_select_words(C->d, both_odd & ~v_less_than_u, tmp->d, C->d, n_width);
372
+
373
+ bn_add_words(tmp->d, B->d, D->d, a_width);
374
+ bn_sub_words(tmp2->d, tmp->d, a->d, a_width);
375
+ bn_select_words(tmp->d, carry, tmp->d, tmp2->d, a_width);
376
+ bn_select_words(B->d, both_odd & v_less_than_u, tmp->d, B->d, a_width);
377
+ bn_select_words(D->d, both_odd & ~v_less_than_u, tmp->d, D->d, a_width);
378
+
379
+ // Our loop invariants hold at this point. Additionally, exactly one of |u|
380
+ // and |v| is now even.
381
+ BN_ULONG u_is_even = ~word_is_odd_mask(u->d[0]);
382
+ BN_ULONG v_is_even = ~word_is_odd_mask(v->d[0]);
383
+ assert(u_is_even != v_is_even);
384
+
385
+ // Halve the even one and adjust the corresponding coefficient.
386
+ maybe_rshift1_words(u->d, u_is_even, tmp->d, n_width);
387
+ BN_ULONG A_or_B_is_odd =
388
+ word_is_odd_mask(A->d[0]) | word_is_odd_mask(B->d[0]);
389
+ BN_ULONG A_carry =
390
+ maybe_add_words(A->d, A_or_B_is_odd & u_is_even, n->d, tmp->d, n_width);
391
+ BN_ULONG B_carry =
392
+ maybe_add_words(B->d, A_or_B_is_odd & u_is_even, a->d, tmp->d, a_width);
393
+ maybe_rshift1_words_carry(A->d, A_carry, u_is_even, tmp->d, n_width);
394
+ maybe_rshift1_words_carry(B->d, B_carry, u_is_even, tmp->d, a_width);
395
+
396
+ maybe_rshift1_words(v->d, v_is_even, tmp->d, n_width);
397
+ BN_ULONG C_or_D_is_odd =
398
+ word_is_odd_mask(C->d[0]) | word_is_odd_mask(D->d[0]);
399
+ BN_ULONG C_carry =
400
+ maybe_add_words(C->d, C_or_D_is_odd & v_is_even, n->d, tmp->d, n_width);
401
+ BN_ULONG D_carry =
402
+ maybe_add_words(D->d, C_or_D_is_odd & v_is_even, a->d, tmp->d, a_width);
403
+ maybe_rshift1_words_carry(C->d, C_carry, v_is_even, tmp->d, n_width);
404
+ maybe_rshift1_words_carry(D->d, D_carry, v_is_even, tmp->d, a_width);
405
+ }
406
+
407
+ assert(BN_is_zero(v));
408
+ if (!BN_is_one(u)) {
409
+ *out_no_inverse = 1;
410
+ OPENSSL_PUT_ERROR(BN, BN_R_NO_INVERSE);
218
411
  goto err;
219
412
  }
220
- ret = 1;
413
+
414
+ ret = BN_copy(r, A) != NULL;
221
415
 
222
416
  err:
223
417
  BN_CTX_end(ctx);
224
418
  return ret;
225
419
  }
226
420
 
227
- // solves ax == 1 (mod n)
228
- static int bn_mod_inverse_general(BIGNUM *out, int *out_no_inverse,
229
- const BIGNUM *a, const BIGNUM *n,
230
- BN_CTX *ctx);
231
-
232
421
  int BN_mod_inverse_odd(BIGNUM *out, int *out_no_inverse, const BIGNUM *a,
233
422
  const BIGNUM *n, BN_CTX *ctx) {
234
423
  *out_no_inverse = 0;
@@ -423,7 +612,7 @@ BIGNUM *BN_mod_inverse(BIGNUM *out, const BIGNUM *a, const BIGNUM *n,
423
612
 
424
613
  int no_inverse;
425
614
  if (!BN_is_odd(n)) {
426
- if (!bn_mod_inverse_general(out, &no_inverse, a, n, ctx)) {
615
+ if (!bn_mod_inverse_consttime(out, &no_inverse, a, n, ctx)) {
427
616
  goto err;
428
617
  }
429
618
  } else if (!BN_mod_inverse_odd(out, &no_inverse, a, n, ctx)) {
@@ -469,139 +658,6 @@ err:
469
658
  return ret;
470
659
  }
471
660
 
472
- // bn_mod_inverse_general is the general inversion algorithm that works for
473
- // both even and odd |n|. It was specifically designed to contain fewer
474
- // branches that may leak sensitive information; see "New Branch Prediction
475
- // Vulnerabilities in OpenSSL and Necessary Software Countermeasures" by
476
- // Onur Acıçmez, Shay Gueron, and Jean-Pierre Seifert.
477
- static int bn_mod_inverse_general(BIGNUM *out, int *out_no_inverse,
478
- const BIGNUM *a, const BIGNUM *n,
479
- BN_CTX *ctx) {
480
- BIGNUM *A, *B, *X, *Y, *M, *D, *T;
481
- int ret = 0;
482
- int sign;
483
-
484
- *out_no_inverse = 0;
485
-
486
- BN_CTX_start(ctx);
487
- A = BN_CTX_get(ctx);
488
- B = BN_CTX_get(ctx);
489
- X = BN_CTX_get(ctx);
490
- D = BN_CTX_get(ctx);
491
- M = BN_CTX_get(ctx);
492
- Y = BN_CTX_get(ctx);
493
- T = BN_CTX_get(ctx);
494
- if (T == NULL) {
495
- goto err;
496
- }
497
-
498
- BIGNUM *R = out;
499
-
500
- BN_zero(Y);
501
- if (!BN_one(X) || BN_copy(B, a) == NULL || BN_copy(A, n) == NULL) {
502
- goto err;
503
- }
504
- A->neg = 0;
505
-
506
- sign = -1;
507
- // From B = a mod |n|, A = |n| it follows that
508
- //
509
- // 0 <= B < A,
510
- // -sign*X*a == B (mod |n|),
511
- // sign*Y*a == A (mod |n|).
512
-
513
- while (!BN_is_zero(B)) {
514
- BIGNUM *tmp;
515
-
516
- // 0 < B < A,
517
- // (*) -sign*X*a == B (mod |n|),
518
- // sign*Y*a == A (mod |n|)
519
-
520
- // (D, M) := (A/B, A%B) ...
521
- if (!BN_div(D, M, A, B, ctx)) {
522
- goto err;
523
- }
524
-
525
- // Now
526
- // A = D*B + M;
527
- // thus we have
528
- // (**) sign*Y*a == D*B + M (mod |n|).
529
-
530
- tmp = A; // keep the BIGNUM object, the value does not matter
531
-
532
- // (A, B) := (B, A mod B) ...
533
- A = B;
534
- B = M;
535
- // ... so we have 0 <= B < A again
536
-
537
- // Since the former M is now B and the former B is now A,
538
- // (**) translates into
539
- // sign*Y*a == D*A + B (mod |n|),
540
- // i.e.
541
- // sign*Y*a - D*A == B (mod |n|).
542
- // Similarly, (*) translates into
543
- // -sign*X*a == A (mod |n|).
544
- //
545
- // Thus,
546
- // sign*Y*a + D*sign*X*a == B (mod |n|),
547
- // i.e.
548
- // sign*(Y + D*X)*a == B (mod |n|).
549
- //
550
- // So if we set (X, Y, sign) := (Y + D*X, X, -sign), we arrive back at
551
- // -sign*X*a == B (mod |n|),
552
- // sign*Y*a == A (mod |n|).
553
- // Note that X and Y stay non-negative all the time.
554
-
555
- if (!BN_mul(tmp, D, X, ctx)) {
556
- goto err;
557
- }
558
- if (!BN_add(tmp, tmp, Y)) {
559
- goto err;
560
- }
561
-
562
- M = Y; // keep the BIGNUM object, the value does not matter
563
- Y = X;
564
- X = tmp;
565
- sign = -sign;
566
- }
567
-
568
- if (!BN_is_one(A)) {
569
- *out_no_inverse = 1;
570
- OPENSSL_PUT_ERROR(BN, BN_R_NO_INVERSE);
571
- goto err;
572
- }
573
-
574
- // The while loop (Euclid's algorithm) ends when
575
- // A == gcd(a,n);
576
- // we have
577
- // sign*Y*a == A (mod |n|),
578
- // where Y is non-negative.
579
-
580
- if (sign < 0) {
581
- if (!BN_sub(Y, n, Y)) {
582
- goto err;
583
- }
584
- }
585
- // Now Y*a == A (mod |n|).
586
-
587
- // Y*a == 1 (mod |n|)
588
- if (!Y->neg && BN_ucmp(Y, n) < 0) {
589
- if (!BN_copy(R, Y)) {
590
- goto err;
591
- }
592
- } else {
593
- if (!BN_nnmod(R, Y, n, ctx)) {
594
- goto err;
595
- }
596
- }
597
-
598
- ret = 1;
599
-
600
- err:
601
- BN_CTX_end(ctx);
602
- return ret;
603
- }
604
-
605
661
  int bn_mod_inverse_prime(BIGNUM *out, const BIGNUM *a, const BIGNUM *p,
606
662
  BN_CTX *ctx, const BN_MONT_CTX *mont_p) {
607
663
  BN_CTX_start(ctx);