grpc 1.37.1 → 1.38.0.pre1

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

Potentially problematic release.


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

Files changed (544) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +64 -58
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +2 -2
  9. data/include/grpc/grpc_security_constants.h +14 -0
  10. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  11. data/include/grpc/impl/codegen/port_platform.h +5 -0
  12. data/include/grpc/module.modulemap +14 -14
  13. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  15. data/src/core/ext/filters/client_channel/client_channel.cc +628 -3101
  16. data/src/core/ext/filters/client_channel/client_channel.h +489 -55
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  20. data/src/core/ext/filters/client_channel/connector.h +1 -1
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -10
  22. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  23. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  24. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  34. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  35. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +23 -23
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +31 -46
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +84 -61
  41. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  42. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  43. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
  55. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  56. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  57. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -11
  58. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  59. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +43 -28
  60. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  62. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  63. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  64. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  65. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  66. data/src/core/ext/filters/client_channel/server_address.cc +1 -1
  67. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  68. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  69. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  70. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  71. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  72. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  73. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  74. data/src/core/ext/filters/client_idle/client_idle_filter.cc +16 -15
  75. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  76. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
  77. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  78. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  79. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  80. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  83. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  84. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  86. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  87. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  89. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  90. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  91. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  92. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -45
  94. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  96. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +2 -2
  97. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +129 -116
  99. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  100. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  103. data/src/core/ext/transport/chttp2/transport/frame_data.cc +8 -8
  104. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  105. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  106. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  107. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  108. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  109. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  110. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  111. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  112. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  113. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  114. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  116. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  118. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  119. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  120. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  121. data/src/core/ext/transport/chttp2/transport/internal.h +31 -27
  122. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  123. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  124. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  125. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  126. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  127. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  128. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  129. data/src/core/ext/xds/xds_api.cc +101 -93
  130. data/src/core/ext/xds/xds_api.h +6 -6
  131. data/src/core/ext/xds/xds_bootstrap.cc +97 -159
  132. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  133. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  134. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  135. data/src/core/ext/xds/xds_channel_args.h +5 -2
  136. data/src/core/ext/xds/xds_client.cc +310 -178
  137. data/src/core/ext/xds/xds_client.h +41 -27
  138. data/src/core/ext/xds/xds_client_stats.h +3 -2
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  140. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  141. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  142. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +3 -20
  143. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +6 -11
  144. data/src/core/lib/channel/channel_stack.cc +10 -9
  145. data/src/core/lib/channel/channel_stack.h +10 -9
  146. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  147. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  148. data/src/core/lib/channel/channelz.cc +21 -13
  149. data/src/core/lib/channel/connected_channel.cc +4 -4
  150. data/src/core/lib/channel/handshaker.cc +7 -6
  151. data/src/core/lib/channel/handshaker.h +5 -5
  152. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  153. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  154. data/src/core/lib/gprpp/ref_counted.h +28 -14
  155. data/src/core/lib/gprpp/status_helper.cc +407 -0
  156. data/src/core/lib/gprpp/status_helper.h +180 -0
  157. data/src/core/lib/http/httpcli.cc +11 -11
  158. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  159. data/src/core/lib/http/parser.cc +16 -16
  160. data/src/core/lib/http/parser.h +4 -4
  161. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  162. data/src/core/lib/iomgr/buffer_list.h +4 -5
  163. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  164. data/src/core/lib/iomgr/call_combiner.h +12 -14
  165. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  166. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  167. data/src/core/lib/iomgr/closure.h +7 -6
  168. data/src/core/lib/iomgr/combiner.cc +14 -12
  169. data/src/core/lib/iomgr/combiner.h +2 -2
  170. data/src/core/lib/iomgr/endpoint.cc +1 -1
  171. data/src/core/lib/iomgr/endpoint.h +2 -2
  172. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  173. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  174. data/src/core/lib/iomgr/error.cc +167 -61
  175. data/src/core/lib/iomgr/error.h +217 -106
  176. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  177. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  178. data/src/core/lib/iomgr/error_internal.h +5 -1
  179. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  180. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  181. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  182. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  183. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  184. data/src/core/lib/iomgr/ev_posix.h +9 -9
  185. data/src/core/lib/iomgr/exec_ctx.cc +4 -4
  186. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  187. data/src/core/lib/iomgr/executor.cc +8 -8
  188. data/src/core/lib/iomgr/executor.h +2 -2
  189. data/src/core/lib/iomgr/iomgr.cc +1 -1
  190. data/src/core/lib/iomgr/iomgr.h +1 -1
  191. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  192. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  193. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  194. data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
  195. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  196. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  197. data/src/core/lib/iomgr/load_file.cc +4 -4
  198. data/src/core/lib/iomgr/load_file.h +2 -2
  199. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  200. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  201. data/src/core/lib/iomgr/pollset.cc +5 -5
  202. data/src/core/lib/iomgr/pollset.h +9 -9
  203. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  204. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  205. data/src/core/lib/iomgr/port.h +1 -1
  206. data/src/core/lib/iomgr/python_util.h +1 -1
  207. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  208. data/src/core/lib/iomgr/resolve_address.h +6 -6
  209. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  210. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  211. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  212. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  213. data/src/core/lib/iomgr/resource_quota.cc +11 -10
  214. data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
  215. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  216. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  217. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  218. data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
  219. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  220. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  221. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  222. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  223. data/src/core/lib/iomgr/tcp_posix.cc +36 -34
  224. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  225. data/src/core/lib/iomgr/tcp_server.h +12 -11
  226. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  227. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  228. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  229. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  230. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  231. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  232. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  233. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  234. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  235. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  236. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  237. data/src/core/lib/iomgr/timer_custom.h +1 -1
  238. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  239. data/src/core/lib/iomgr/udp_server.cc +21 -20
  240. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  241. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  242. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  243. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  244. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  245. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  246. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  247. data/src/core/lib/iomgr/work_serializer.h +17 -1
  248. data/src/core/lib/json/json.h +1 -1
  249. data/src/core/lib/json/json_reader.cc +4 -4
  250. data/src/core/lib/matchers/matchers.cc +39 -39
  251. data/src/core/lib/matchers/matchers.h +28 -28
  252. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  253. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  254. data/src/core/lib/security/credentials/credentials.h +2 -2
  255. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  256. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  257. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  258. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  259. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  260. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  261. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  262. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  263. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  264. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  265. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  271. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  274. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  276. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  278. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  279. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  280. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  281. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  282. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  283. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  284. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  285. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  286. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  287. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  288. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  289. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  290. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  291. data/src/core/lib/security/security_connector/ssl_utils.cc +22 -4
  292. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  293. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +56 -60
  294. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  295. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  296. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  297. data/src/core/lib/security/transport/security_handshaker.cc +33 -32
  298. data/src/core/lib/security/transport/server_auth_filter.cc +19 -13
  299. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  300. data/src/core/lib/security/transport/tsi_error.h +2 -1
  301. data/src/core/lib/security/util/json_util.cc +2 -2
  302. data/src/core/lib/security/util/json_util.h +1 -1
  303. data/src/core/lib/surface/call.cc +46 -45
  304. data/src/core/lib/surface/call.h +2 -2
  305. data/src/core/lib/surface/channel.cc +6 -6
  306. data/src/core/lib/surface/channel.h +3 -2
  307. data/src/core/lib/surface/channel_ping.cc +1 -1
  308. data/src/core/lib/surface/completion_queue.cc +46 -47
  309. data/src/core/lib/surface/completion_queue.h +2 -1
  310. data/src/core/lib/surface/lame_client.cc +11 -11
  311. data/src/core/lib/surface/lame_client.h +1 -1
  312. data/src/core/lib/surface/server.cc +28 -22
  313. data/src/core/lib/surface/server.h +16 -15
  314. data/src/core/lib/surface/validate_metadata.cc +7 -7
  315. data/src/core/lib/surface/validate_metadata.h +3 -2
  316. data/src/core/lib/surface/version.cc +4 -2
  317. data/src/core/lib/transport/byte_stream.cc +5 -5
  318. data/src/core/lib/transport/byte_stream.h +8 -8
  319. data/src/core/lib/transport/connectivity_state.cc +1 -1
  320. data/src/core/lib/transport/error_utils.cc +19 -8
  321. data/src/core/lib/transport/error_utils.h +11 -5
  322. data/src/core/lib/transport/metadata_batch.cc +37 -37
  323. data/src/core/lib/transport/metadata_batch.h +19 -18
  324. data/src/core/lib/transport/transport.cc +4 -3
  325. data/src/core/lib/transport/transport.h +4 -4
  326. data/src/core/lib/transport/transport_op_string.cc +5 -5
  327. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  329. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  331. data/src/core/tsi/ssl_transport_security.cc +32 -14
  332. data/src/core/tsi/ssl_transport_security.h +3 -4
  333. data/src/ruby/bin/math_services_pb.rb +1 -1
  334. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  335. data/src/ruby/lib/grpc/version.rb +1 -1
  336. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  337. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  338. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  339. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  340. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  341. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  342. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  343. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  344. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  345. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  346. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  347. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  348. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  349. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  350. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  351. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  352. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  353. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  354. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  355. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  356. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  357. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  358. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  359. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  360. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  361. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  362. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  363. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  364. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  365. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  366. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  367. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  368. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  369. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  370. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  371. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  372. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  373. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  374. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  375. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  376. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  377. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  378. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  379. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  380. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  381. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  382. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  383. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  384. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  385. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  387. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  388. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  389. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  390. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  391. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  392. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  393. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  394. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  395. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  396. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  397. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  398. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  399. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  400. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  401. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  402. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  403. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  404. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  405. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  406. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  407. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  408. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  409. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  410. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  411. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  412. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  413. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  414. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  415. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  416. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  417. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  418. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  419. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  420. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  421. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  422. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  423. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  424. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  425. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  426. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  427. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  428. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  429. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  430. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  431. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  432. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  433. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  434. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  435. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  436. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  437. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  438. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  439. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  440. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  441. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  442. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  443. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  444. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  445. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  446. data/third_party/boringssl-with-bazel/err_data.c +477 -461
  447. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  448. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
  449. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  450. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  451. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  452. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  453. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  454. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  455. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  456. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  457. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  458. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  459. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  460. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  461. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  462. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  463. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  464. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  465. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  466. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  467. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  468. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  469. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  470. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  471. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  472. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  473. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  474. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  475. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  476. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  477. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  478. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  479. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  480. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  481. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  482. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  483. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
  484. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
  485. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  486. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  487. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  488. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  489. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  490. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  491. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  504. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  505. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  506. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  507. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  508. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  509. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
  510. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  511. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  512. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  513. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  514. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  515. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
  516. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  517. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  518. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  519. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  520. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  521. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +185 -17
  522. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  523. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -121
  524. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
  525. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  526. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  527. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  528. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
  529. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
  530. data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
  531. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  532. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  533. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  534. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
  535. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +98 -64
  536. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  537. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
  538. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  539. metadata +68 -45
  540. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  541. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  542. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  543. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
@@ -368,84 +368,6 @@ void ERR_clear_system_error(void) {
368
368
  errno = 0;
369
369
  }
370
370
 
371
- char *ERR_error_string(uint32_t packed_error, char *ret) {
372
- static char buf[ERR_ERROR_STRING_BUF_LEN];
373
-
374
- if (ret == NULL) {
375
- // TODO(fork): remove this.
376
- ret = buf;
377
- }
378
-
379
- #if !defined(NDEBUG)
380
- // This is aimed to help catch callers who don't provide
381
- // |ERR_ERROR_STRING_BUF_LEN| bytes of space.
382
- OPENSSL_memset(ret, 0, ERR_ERROR_STRING_BUF_LEN);
383
- #endif
384
-
385
- return ERR_error_string_n(packed_error, ret, ERR_ERROR_STRING_BUF_LEN);
386
- }
387
-
388
- char *ERR_error_string_n(uint32_t packed_error, char *buf, size_t len) {
389
- char lib_buf[64], reason_buf[64];
390
- const char *lib_str, *reason_str;
391
- unsigned lib, reason;
392
-
393
- if (len == 0) {
394
- return NULL;
395
- }
396
-
397
- lib = ERR_GET_LIB(packed_error);
398
- reason = ERR_GET_REASON(packed_error);
399
-
400
- lib_str = ERR_lib_error_string(packed_error);
401
- reason_str = ERR_reason_error_string(packed_error);
402
-
403
- if (lib_str == NULL) {
404
- BIO_snprintf(lib_buf, sizeof(lib_buf), "lib(%u)", lib);
405
- lib_str = lib_buf;
406
- }
407
-
408
- if (reason_str == NULL) {
409
- BIO_snprintf(reason_buf, sizeof(reason_buf), "reason(%u)", reason);
410
- reason_str = reason_buf;
411
- }
412
-
413
- BIO_snprintf(buf, len, "error:%08" PRIx32 ":%s:OPENSSL_internal:%s",
414
- packed_error, lib_str, reason_str);
415
-
416
- if (strlen(buf) == len - 1) {
417
- // output may be truncated; make sure we always have 5 colon-separated
418
- // fields, i.e. 4 colons.
419
- static const unsigned num_colons = 4;
420
- unsigned i;
421
- char *s = buf;
422
-
423
- if (len <= num_colons) {
424
- // In this situation it's not possible to ensure that the correct number
425
- // of colons are included in the output.
426
- return buf;
427
- }
428
-
429
- for (i = 0; i < num_colons; i++) {
430
- char *colon = strchr(s, ':');
431
- char *last_pos = &buf[len - 1] - num_colons + i;
432
-
433
- if (colon == NULL || colon > last_pos) {
434
- // set colon |i| at last possible position (buf[len-1] is the
435
- // terminating 0). If we're setting this colon, then all whole of the
436
- // rest of the string must be colons in order to have the correct
437
- // number.
438
- OPENSSL_memset(last_pos, ':', num_colons - i);
439
- break;
440
- }
441
-
442
- s = colon + 1;
443
- }
444
- }
445
-
446
- return buf;
447
- }
448
-
449
371
  // err_string_cmp is a compare function for searching error values with
450
372
  // |bsearch| in |err_string_lookup|.
451
373
  static int err_string_cmp(const void *a, const void *b) {
@@ -530,7 +452,7 @@ static const char *const kLibraryNames[ERR_NUM_LIBS] = {
530
452
  "User defined functions", // ERR_LIB_USER
531
453
  };
532
454
 
533
- const char *ERR_lib_error_string(uint32_t packed_error) {
455
+ static const char *err_lib_error_string(uint32_t packed_error) {
534
456
  const uint32_t lib = ERR_GET_LIB(packed_error);
535
457
 
536
458
  if (lib >= ERR_NUM_LIBS) {
@@ -539,11 +461,16 @@ const char *ERR_lib_error_string(uint32_t packed_error) {
539
461
  return kLibraryNames[lib];
540
462
  }
541
463
 
464
+ const char *ERR_lib_error_string(uint32_t packed_error) {
465
+ const char *ret = err_lib_error_string(packed_error);
466
+ return ret == NULL ? "unknown library" : ret;
467
+ }
468
+
542
469
  const char *ERR_func_error_string(uint32_t packed_error) {
543
470
  return "OPENSSL_internal";
544
471
  }
545
472
 
546
- const char *ERR_reason_error_string(uint32_t packed_error) {
473
+ static const char *err_reason_error_string(uint32_t packed_error) {
547
474
  const uint32_t lib = ERR_GET_LIB(packed_error);
548
475
  const uint32_t reason = ERR_GET_REASON(packed_error);
549
476
 
@@ -579,6 +506,86 @@ const char *ERR_reason_error_string(uint32_t packed_error) {
579
506
  kOpenSSLReasonValuesLen, kOpenSSLReasonStringData);
580
507
  }
581
508
 
509
+ const char *ERR_reason_error_string(uint32_t packed_error) {
510
+ const char *ret = err_reason_error_string(packed_error);
511
+ return ret == NULL ? "unknown error" : ret;
512
+ }
513
+
514
+ char *ERR_error_string(uint32_t packed_error, char *ret) {
515
+ static char buf[ERR_ERROR_STRING_BUF_LEN];
516
+
517
+ if (ret == NULL) {
518
+ // TODO(fork): remove this.
519
+ ret = buf;
520
+ }
521
+
522
+ #if !defined(NDEBUG)
523
+ // This is aimed to help catch callers who don't provide
524
+ // |ERR_ERROR_STRING_BUF_LEN| bytes of space.
525
+ OPENSSL_memset(ret, 0, ERR_ERROR_STRING_BUF_LEN);
526
+ #endif
527
+
528
+ return ERR_error_string_n(packed_error, ret, ERR_ERROR_STRING_BUF_LEN);
529
+ }
530
+
531
+ char *ERR_error_string_n(uint32_t packed_error, char *buf, size_t len) {
532
+ if (len == 0) {
533
+ return NULL;
534
+ }
535
+
536
+ unsigned lib = ERR_GET_LIB(packed_error);
537
+ unsigned reason = ERR_GET_REASON(packed_error);
538
+
539
+ const char *lib_str = err_lib_error_string(packed_error);
540
+ const char *reason_str = err_reason_error_string(packed_error);
541
+
542
+ char lib_buf[64], reason_buf[64];
543
+ if (lib_str == NULL) {
544
+ BIO_snprintf(lib_buf, sizeof(lib_buf), "lib(%u)", lib);
545
+ lib_str = lib_buf;
546
+ }
547
+
548
+ if (reason_str == NULL) {
549
+ BIO_snprintf(reason_buf, sizeof(reason_buf), "reason(%u)", reason);
550
+ reason_str = reason_buf;
551
+ }
552
+
553
+ BIO_snprintf(buf, len, "error:%08" PRIx32 ":%s:OPENSSL_internal:%s",
554
+ packed_error, lib_str, reason_str);
555
+
556
+ if (strlen(buf) == len - 1) {
557
+ // output may be truncated; make sure we always have 5 colon-separated
558
+ // fields, i.e. 4 colons.
559
+ static const unsigned num_colons = 4;
560
+ unsigned i;
561
+ char *s = buf;
562
+
563
+ if (len <= num_colons) {
564
+ // In this situation it's not possible to ensure that the correct number
565
+ // of colons are included in the output.
566
+ return buf;
567
+ }
568
+
569
+ for (i = 0; i < num_colons; i++) {
570
+ char *colon = strchr(s, ':');
571
+ char *last_pos = &buf[len - 1] - num_colons + i;
572
+
573
+ if (colon == NULL || colon > last_pos) {
574
+ // set colon |i| at last possible position (buf[len-1] is the
575
+ // terminating 0). If we're setting this colon, then all whole of the
576
+ // rest of the string must be colons in order to have the correct
577
+ // number.
578
+ OPENSSL_memset(last_pos, ':', num_colons - i);
579
+ break;
580
+ }
581
+
582
+ s = colon + 1;
583
+ }
584
+ }
585
+
586
+ return buf;
587
+ }
588
+
582
589
  void ERR_print_errors_cb(ERR_print_errors_callback_t callback, void *ctx) {
583
590
  char buf[ERR_ERROR_STRING_BUF_LEN];
584
591
  char buf2[1024];
@@ -97,6 +97,7 @@
97
97
  #include "rsa/padding.c"
98
98
  #include "rsa/rsa.c"
99
99
  #include "rsa/rsa_impl.c"
100
+ #include "self_check/fips.c"
100
101
  #include "self_check/self_check.c"
101
102
  #include "sha/sha1-altivec.c"
102
103
  #include "sha/sha1.c"
@@ -297,7 +297,7 @@ void bn_mul_comba4(BN_ULONG r[8], const BN_ULONG a[4], const BN_ULONG b[4]);
297
297
  void bn_mul_comba8(BN_ULONG r[16], const BN_ULONG a[8], const BN_ULONG b[8]);
298
298
 
299
299
  // bn_sqr_comba8 sets |r| to |a|^2.
300
- void bn_sqr_comba8(BN_ULONG r[16], const BN_ULONG a[4]);
300
+ void bn_sqr_comba8(BN_ULONG r[16], const BN_ULONG a[8]);
301
301
 
302
302
  // bn_sqr_comba4 sets |r| to |a|^2.
303
303
  void bn_sqr_comba4(BN_ULONG r[8], const BN_ULONG a[4]);
@@ -225,7 +225,6 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
225
225
 
226
226
  ctx->buf_len = 0;
227
227
  ctx->final_used = 0;
228
- ctx->block_mask = ctx->cipher->block_size - 1;
229
228
  return 1;
230
229
  }
231
230
 
@@ -239,6 +238,15 @@ int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
239
238
  return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 0);
240
239
  }
241
240
 
241
+ // block_remainder returns the number of bytes to remove from |len| to get a
242
+ // multiple of |ctx|'s block size.
243
+ static int block_remainder(const EVP_CIPHER_CTX *ctx, int len) {
244
+ // |block_size| must be a power of two.
245
+ assert(ctx->cipher->block_size != 0);
246
+ assert((ctx->cipher->block_size & (ctx->cipher->block_size - 1)) == 0);
247
+ return len & (ctx->cipher->block_size - 1);
248
+ }
249
+
242
250
  int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len,
243
251
  const uint8_t *in, int in_len) {
244
252
  // Ciphers that use blocks may write up to |bl| extra bytes. Ensure the output
@@ -264,7 +272,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len,
264
272
  return in_len == 0;
265
273
  }
266
274
 
267
- if (ctx->buf_len == 0 && (in_len & ctx->block_mask) == 0) {
275
+ if (ctx->buf_len == 0 && block_remainder(ctx, in_len) == 0) {
268
276
  if (ctx->cipher->cipher(ctx, out, in, in_len)) {
269
277
  *out_len = in_len;
270
278
  return 1;
@@ -297,7 +305,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len,
297
305
  *out_len = 0;
298
306
  }
299
307
 
300
- i = in_len & ctx->block_mask;
308
+ i = block_remainder(ctx, in_len);
301
309
  in_len -= i;
302
310
  if (in_len > 0) {
303
311
  if (!ctx->cipher->cipher(ctx, out, in, in_len)) {
@@ -141,10 +141,22 @@ typedef struct {
141
141
 
142
142
  static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key,
143
143
  const uint8_t *iv, int enc) {
144
- int ret, mode;
144
+ int ret;
145
145
  EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
146
+ const int mode = ctx->cipher->flags & EVP_CIPH_MODE_MASK;
147
+
148
+ if (mode == EVP_CIPH_CTR_MODE) {
149
+ switch (ctx->key_len) {
150
+ case 16:
151
+ boringssl_fips_inc_counter(fips_counter_evp_aes_128_ctr);
152
+ break;
153
+
154
+ case 32:
155
+ boringssl_fips_inc_counter(fips_counter_evp_aes_256_ctr);
156
+ break;
157
+ }
158
+ }
146
159
 
147
- mode = ctx->cipher->flags & EVP_CIPH_MODE_MASK;
148
160
  if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE) && !enc) {
149
161
  if (hwaes_capable()) {
150
162
  ret = aes_hw_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks);
@@ -353,6 +365,17 @@ static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key,
353
365
  if (!iv && !key) {
354
366
  return 1;
355
367
  }
368
+
369
+ switch (ctx->key_len) {
370
+ case 16:
371
+ boringssl_fips_inc_counter(fips_counter_evp_aes_128_gcm);
372
+ break;
373
+
374
+ case 32:
375
+ boringssl_fips_inc_counter(fips_counter_evp_aes_256_gcm);
376
+ break;
377
+ }
378
+
356
379
  if (key) {
357
380
  OPENSSL_memset(&gctx->gcm, 0, sizeof(gctx->gcm));
358
381
  gctx->ctr = aes_ctr_set_key(&gctx->ks.ks, &gctx->gcm.gcm_key, NULL, key,
@@ -247,13 +247,21 @@ static void sha512_256_init(EVP_MD_CTX *ctx) {
247
247
  CHECK(SHA512_256_Init(ctx->md_data));
248
248
  }
249
249
 
250
+ static void sha512_256_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
251
+ CHECK(SHA512_256_Update(ctx->md_data, data, count));
252
+ }
253
+
254
+ static void sha512_256_final(EVP_MD_CTX *ctx, uint8_t *md) {
255
+ CHECK(SHA512_256_Final(md, ctx->md_data));
256
+ }
257
+
250
258
  DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha512_256) {
251
259
  out->type = NID_sha512_256;
252
260
  out->md_size = SHA512_256_DIGEST_LENGTH;
253
261
  out->flags = 0;
254
262
  out->init = sha512_256_init;
255
- out->update = sha512_update;
256
- out->final = sha512_final;
263
+ out->update = sha512_256_update;
264
+ out->final = sha512_256_final;
257
265
  out->block_size = 128;
258
266
  out->ctx_size = sizeof(SHA512_CTX);
259
267
  }
@@ -136,44 +136,6 @@ extern "C" {
136
136
  #error "HASH_MAKE_STRING must be defined!"
137
137
  #endif
138
138
 
139
- #if defined(DATA_ORDER_IS_BIG_ENDIAN)
140
-
141
- #define HOST_c2l(c, l) \
142
- do { \
143
- (l) = (((uint32_t)(*((c)++))) << 24); \
144
- (l) |= (((uint32_t)(*((c)++))) << 16); \
145
- (l) |= (((uint32_t)(*((c)++))) << 8); \
146
- (l) |= (((uint32_t)(*((c)++)))); \
147
- } while (0)
148
-
149
- #define HOST_l2c(l, c) \
150
- do { \
151
- *((c)++) = (uint8_t)(((l) >> 24) & 0xff); \
152
- *((c)++) = (uint8_t)(((l) >> 16) & 0xff); \
153
- *((c)++) = (uint8_t)(((l) >> 8) & 0xff); \
154
- *((c)++) = (uint8_t)(((l)) & 0xff); \
155
- } while (0)
156
-
157
- #elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
158
-
159
- #define HOST_c2l(c, l) \
160
- do { \
161
- (l) = (((uint32_t)(*((c)++)))); \
162
- (l) |= (((uint32_t)(*((c)++))) << 8); \
163
- (l) |= (((uint32_t)(*((c)++))) << 16); \
164
- (l) |= (((uint32_t)(*((c)++))) << 24); \
165
- } while (0)
166
-
167
- #define HOST_l2c(l, c) \
168
- do { \
169
- *((c)++) = (uint8_t)(((l)) & 0xff); \
170
- *((c)++) = (uint8_t)(((l) >> 8) & 0xff); \
171
- *((c)++) = (uint8_t)(((l) >> 16) & 0xff); \
172
- *((c)++) = (uint8_t)(((l) >> 24) & 0xff); \
173
- } while (0)
174
-
175
- #endif // DATA_ORDER
176
-
177
139
  int HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len) {
178
140
  const uint8_t *data = data_;
179
141
 
@@ -247,13 +209,12 @@ int HASH_FINAL(uint8_t out[HASH_DIGEST_LENGTH], HASH_CTX *c) {
247
209
  // Append a 64-bit length to the block and process it.
248
210
  uint8_t *p = c->data + HASH_CBLOCK - 8;
249
211
  #if defined(DATA_ORDER_IS_BIG_ENDIAN)
250
- HOST_l2c(c->Nh, p);
251
- HOST_l2c(c->Nl, p);
212
+ CRYPTO_store_u32_be(p, c->Nh);
213
+ CRYPTO_store_u32_be(p + 4, c->Nl);
252
214
  #elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
253
- HOST_l2c(c->Nl, p);
254
- HOST_l2c(c->Nh, p);
215
+ CRYPTO_store_u32_le(p, c->Nl);
216
+ CRYPTO_store_u32_le(p + 4, c->Nh);
255
217
  #endif
256
- assert(p == c->data + HASH_CBLOCK);
257
218
  HASH_BLOCK_DATA_ORDER(c->h, c->data, 1);
258
219
  c->num = 0;
259
220
  OPENSSL_memset(c->data, 0, HASH_CBLOCK);
@@ -1232,6 +1232,10 @@ void ec_set_to_safe_point(const EC_GROUP *group, EC_RAW_POINT *out) {
1232
1232
 
1233
1233
  void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag) {}
1234
1234
 
1235
+ int EC_GROUP_get_asn1_flag(const EC_GROUP *group) {
1236
+ return OPENSSL_EC_NAMED_CURVE;
1237
+ }
1238
+
1235
1239
  const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group) {
1236
1240
  // This function exists purely to give callers a way to call
1237
1241
  // |EC_METHOD_get_field_type|. cryptography.io crashes if |EC_GROUP_method_of|
@@ -171,7 +171,6 @@ void EC_KEY_free(EC_KEY *r) {
171
171
  EC_GROUP_free(r->group);
172
172
  EC_POINT_free(r->pub_key);
173
173
  ec_wrapped_scalar_free(r->priv_key);
174
- BN_free(r->fixed_k);
175
174
 
176
175
  CRYPTO_free_ex_data(g_ec_ex_data_class_bss_get(), r, &r->ex_data);
177
176
 
@@ -729,10 +729,6 @@ struct ec_key_st {
729
729
  EC_POINT *pub_key;
730
730
  EC_WRAPPED_SCALAR *priv_key;
731
731
 
732
- // fixed_k may contain a specific value of 'k', to be used in ECDSA signing.
733
- // This is only for the FIPS power-on tests.
734
- BIGNUM *fixed_k;
735
-
736
732
  unsigned int enc_flag;
737
733
  point_conversion_form_t conv_form;
738
734
 
@@ -61,9 +61,10 @@
61
61
  #include <openssl/sha.h>
62
62
  #include <openssl/type_check.h>
63
63
 
64
+ #include "../../internal.h"
64
65
  #include "../bn/internal.h"
65
66
  #include "../ec/internal.h"
66
- #include "../../internal.h"
67
+ #include "internal.h"
67
68
 
68
69
 
69
70
  // digest_to_scalar interprets |digest_len| bytes from |digest| as a scalar for
@@ -198,70 +199,74 @@ int ECDSA_do_verify(const uint8_t *digest, size_t digest_len,
198
199
  return 1;
199
200
  }
200
201
 
201
- static int ecdsa_sign_setup(const EC_KEY *eckey, EC_SCALAR *out_kinv_mont,
202
- EC_SCALAR *out_r, const uint8_t *digest,
203
- size_t digest_len, const EC_SCALAR *priv_key) {
202
+ static ECDSA_SIG *ecdsa_sign_impl(const EC_GROUP *group, int *out_retry,
203
+ const EC_SCALAR *priv_key, const EC_SCALAR *k,
204
+ const uint8_t *digest, size_t digest_len) {
205
+ *out_retry = 0;
206
+
204
207
  // Check that the size of the group order is FIPS compliant (FIPS 186-4
205
208
  // B.5.2).
206
- const EC_GROUP *group = EC_KEY_get0_group(eckey);
207
209
  const BIGNUM *order = EC_GROUP_get0_order(group);
208
210
  if (BN_num_bits(order) < 160) {
209
211
  OPENSSL_PUT_ERROR(ECDSA, EC_R_INVALID_GROUP_ORDER);
210
- return 0;
212
+ return NULL;
211
213
  }
212
214
 
213
- int ret = 0;
214
- EC_SCALAR k;
215
+ // Compute r, the x-coordinate of k * generator.
215
216
  EC_RAW_POINT tmp_point;
216
- do {
217
- // Include the private key and message digest in the k generation.
218
- if (eckey->fixed_k != NULL) {
219
- if (!ec_bignum_to_scalar(group, &k, eckey->fixed_k)) {
220
- goto err;
221
- }
222
- if (ec_scalar_is_zero(group, &k)) {
223
- OPENSSL_PUT_ERROR(ECDSA, ERR_R_INTERNAL_ERROR);
224
- goto err;
225
- }
226
- } else {
227
- // Pass a SHA512 hash of the private key and digest as additional data
228
- // into the RBG. This is a hardening measure against entropy failure.
229
- OPENSSL_STATIC_ASSERT(SHA512_DIGEST_LENGTH >= 32,
230
- "additional_data is too large for SHA-512");
231
- SHA512_CTX sha;
232
- uint8_t additional_data[SHA512_DIGEST_LENGTH];
233
- SHA512_Init(&sha);
234
- SHA512_Update(&sha, priv_key->words, order->width * sizeof(BN_ULONG));
235
- SHA512_Update(&sha, digest, digest_len);
236
- SHA512_Final(additional_data, &sha);
237
- if (!ec_random_nonzero_scalar(group, &k, additional_data)) {
238
- goto err;
239
- }
240
- }
217
+ EC_SCALAR r;
218
+ if (!ec_point_mul_scalar_base(group, &tmp_point, k) ||
219
+ !ec_get_x_coordinate_as_scalar(group, &r, &tmp_point)) {
220
+ return NULL;
221
+ }
241
222
 
242
- // Compute k^-1 in the Montgomery domain. This is |ec_scalar_to_montgomery|
243
- // followed by |ec_scalar_inv0_montgomery|, but |ec_scalar_inv0_montgomery|
244
- // followed by |ec_scalar_from_montgomery| is equivalent and slightly more
245
- // efficient. Note k is non-zero, so the inverse must exist.
246
- ec_scalar_inv0_montgomery(group, out_kinv_mont, &k);
247
- ec_scalar_from_montgomery(group, out_kinv_mont, out_kinv_mont);
248
-
249
- // Compute r, the x-coordinate of generator * k.
250
- if (!ec_point_mul_scalar_base(group, &tmp_point, &k) ||
251
- !ec_get_x_coordinate_as_scalar(group, out_r, &tmp_point)) {
252
- goto err;
253
- }
254
- } while (ec_scalar_is_zero(group, out_r));
223
+ if (ec_scalar_is_zero(group, &r)) {
224
+ *out_retry = 1;
225
+ return NULL;
226
+ }
255
227
 
256
- ret = 1;
228
+ // s = priv_key * r. Note if only one parameter is in the Montgomery domain,
229
+ // |ec_scalar_mod_mul_montgomery| will compute the answer in the normal
230
+ // domain.
231
+ EC_SCALAR s;
232
+ ec_scalar_to_montgomery(group, &s, &r);
233
+ ec_scalar_mul_montgomery(group, &s, priv_key, &s);
234
+
235
+ // s = m + priv_key * r.
236
+ EC_SCALAR tmp;
237
+ digest_to_scalar(group, &tmp, digest, digest_len);
238
+ ec_scalar_add(group, &s, &s, &tmp);
239
+
240
+ // s = k^-1 * (m + priv_key * r). First, we compute k^-1 in the Montgomery
241
+ // domain. This is |ec_scalar_to_montgomery| followed by
242
+ // |ec_scalar_inv0_montgomery|, but |ec_scalar_inv0_montgomery| followed by
243
+ // |ec_scalar_from_montgomery| is equivalent and slightly more efficient.
244
+ // Then, as above, only one parameter is in the Montgomery domain, so the
245
+ // result is in the normal domain. Finally, note k is non-zero (or computing r
246
+ // would fail), so the inverse must exist.
247
+ ec_scalar_inv0_montgomery(group, &tmp, k); // tmp = k^-1 R^2
248
+ ec_scalar_from_montgomery(group, &tmp, &tmp); // tmp = k^-1 R
249
+ ec_scalar_mul_montgomery(group, &s, &s, &tmp);
250
+ if (ec_scalar_is_zero(group, &s)) {
251
+ *out_retry = 1;
252
+ return NULL;
253
+ }
257
254
 
258
- err:
259
- OPENSSL_cleanse(&k, sizeof(k));
255
+ ECDSA_SIG *ret = ECDSA_SIG_new();
256
+ if (ret == NULL || //
257
+ !bn_set_words(ret->r, r.words, order->width) ||
258
+ !bn_set_words(ret->s, s.words, order->width)) {
259
+ ECDSA_SIG_free(ret);
260
+ return NULL;
261
+ }
260
262
  return ret;
261
263
  }
262
264
 
263
- ECDSA_SIG *ECDSA_do_sign(const uint8_t *digest, size_t digest_len,
264
- const EC_KEY *eckey) {
265
+ ECDSA_SIG *ecdsa_sign_with_nonce_for_known_answer_test(const uint8_t *digest,
266
+ size_t digest_len,
267
+ const EC_KEY *eckey,
268
+ const uint8_t *nonce,
269
+ size_t nonce_len) {
265
270
  if (eckey->ecdsa_meth && eckey->ecdsa_meth->sign) {
266
271
  OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_NOT_IMPLEMENTED);
267
272
  return NULL;
@@ -272,57 +277,63 @@ ECDSA_SIG *ECDSA_do_sign(const uint8_t *digest, size_t digest_len,
272
277
  OPENSSL_PUT_ERROR(ECDSA, ERR_R_PASSED_NULL_PARAMETER);
273
278
  return NULL;
274
279
  }
275
- const BIGNUM *order = EC_GROUP_get0_order(group);
276
280
  const EC_SCALAR *priv_key = &eckey->priv_key->scalar;
277
281
 
278
- int ok = 0;
279
- ECDSA_SIG *ret = ECDSA_SIG_new();
280
- EC_SCALAR kinv_mont, r_mont, s, m, tmp;
281
- if (ret == NULL) {
282
- OPENSSL_PUT_ERROR(ECDSA, ERR_R_MALLOC_FAILURE);
282
+ EC_SCALAR k;
283
+ if (!ec_scalar_from_bytes(group, &k, nonce, nonce_len)) {
283
284
  return NULL;
284
285
  }
286
+ int retry_ignored;
287
+ return ecdsa_sign_impl(group, &retry_ignored, priv_key, &k, digest,
288
+ digest_len);
289
+ }
285
290
 
286
- digest_to_scalar(group, &m, digest, digest_len);
287
- for (;;) {
288
- if (!ecdsa_sign_setup(eckey, &kinv_mont, &r_mont, digest, digest_len,
289
- priv_key) ||
290
- !bn_set_words(ret->r, r_mont.words, order->width)) {
291
- goto err;
292
- }
293
-
294
- // Compute priv_key * r (mod order). Note if only one parameter is in the
295
- // Montgomery domain, |ec_scalar_mod_mul_montgomery| will compute the answer
296
- // in the normal domain.
297
- ec_scalar_to_montgomery(group, &r_mont, &r_mont);
298
- ec_scalar_mul_montgomery(group, &s, priv_key, &r_mont);
291
+ // This function is only exported for testing and is not called in production
292
+ // code.
293
+ ECDSA_SIG *ECDSA_sign_with_nonce_and_leak_private_key_for_testing(
294
+ const uint8_t *digest, size_t digest_len, const EC_KEY *eckey,
295
+ const uint8_t *nonce, size_t nonce_len) {
296
+ return ecdsa_sign_with_nonce_for_known_answer_test(digest, digest_len, eckey,
297
+ nonce, nonce_len);
298
+ }
299
299
 
300
- // Compute tmp = m + priv_key * r.
301
- ec_scalar_add(group, &tmp, &m, &s);
300
+ ECDSA_SIG *ECDSA_do_sign(const uint8_t *digest, size_t digest_len,
301
+ const EC_KEY *eckey) {
302
+ if (eckey->ecdsa_meth && eckey->ecdsa_meth->sign) {
303
+ OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_NOT_IMPLEMENTED);
304
+ return NULL;
305
+ }
302
306
 
303
- // Finally, multiply s by k^-1. That was retained in Montgomery form, so the
304
- // same technique as the previous multiplication works.
305
- ec_scalar_mul_montgomery(group, &s, &tmp, &kinv_mont);
306
- if (!bn_set_words(ret->s, s.words, order->width)) {
307
- goto err;
308
- }
309
- if (!BN_is_zero(ret->s)) {
310
- // s != 0 => we have a valid signature
311
- break;
312
- }
307
+ const EC_GROUP *group = EC_KEY_get0_group(eckey);
308
+ if (group == NULL || eckey->priv_key == NULL) {
309
+ OPENSSL_PUT_ERROR(ECDSA, ERR_R_PASSED_NULL_PARAMETER);
310
+ return NULL;
313
311
  }
312
+ const BIGNUM *order = EC_GROUP_get0_order(group);
313
+ const EC_SCALAR *priv_key = &eckey->priv_key->scalar;
314
314
 
315
- ok = 1;
315
+ // Pass a SHA512 hash of the private key and digest as additional data
316
+ // into the RBG. This is a hardening measure against entropy failure.
317
+ OPENSSL_STATIC_ASSERT(SHA512_DIGEST_LENGTH >= 32,
318
+ "additional_data is too large for SHA-512");
319
+ SHA512_CTX sha;
320
+ uint8_t additional_data[SHA512_DIGEST_LENGTH];
321
+ SHA512_Init(&sha);
322
+ SHA512_Update(&sha, priv_key->words, order->width * sizeof(BN_ULONG));
323
+ SHA512_Update(&sha, digest, digest_len);
324
+ SHA512_Final(additional_data, &sha);
316
325
 
317
- err:
318
- if (!ok) {
319
- ECDSA_SIG_free(ret);
320
- ret = NULL;
326
+ for (;;) {
327
+ EC_SCALAR k;
328
+ if (!ec_random_nonzero_scalar(group, &k, additional_data)) {
329
+ return NULL;
330
+ }
331
+
332
+ int retry;
333
+ ECDSA_SIG *sig =
334
+ ecdsa_sign_impl(group, &retry, priv_key, &k, digest, digest_len);
335
+ if (sig != NULL || !retry) {
336
+ return sig;
337
+ }
321
338
  }
322
- OPENSSL_cleanse(&kinv_mont, sizeof(kinv_mont));
323
- OPENSSL_cleanse(&r_mont, sizeof(r_mont));
324
- OPENSSL_cleanse(&s, sizeof(s));
325
- OPENSSL_cleanse(&tmp, sizeof(tmp));
326
- OPENSSL_cleanse(&m, sizeof(m));
327
- return ret;
328
339
  }