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
@@ -78,7 +78,7 @@ int i2d_ASN1_BOOLEAN(int a, unsigned char **pp)
78
78
  }
79
79
 
80
80
  ASN1_put_object(&p, 0, 1, V_ASN1_BOOLEAN, V_ASN1_UNIVERSAL);
81
- *p = (unsigned char)a;
81
+ *p = a ? 0xff : 0x00;
82
82
 
83
83
  /*
84
84
  * If a new buffer was allocated, just return it back.
@@ -263,7 +263,7 @@ void ASN1_OBJECT_free(ASN1_OBJECT *a)
263
263
  OPENSSL_free(a);
264
264
  }
265
265
 
266
- ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len,
266
+ ASN1_OBJECT *ASN1_OBJECT_create(int nid, const unsigned char *data, int len,
267
267
  const char *sn, const char *ln)
268
268
  {
269
269
  ASN1_OBJECT o;
@@ -66,18 +66,28 @@
66
66
 
67
67
  int ASN1_TYPE_get(const ASN1_TYPE *a)
68
68
  {
69
- if ((a->value.ptr != NULL) || (a->type == V_ASN1_NULL))
70
- return (a->type);
71
- else
72
- return (0);
69
+ if (a->type == V_ASN1_BOOLEAN || a->type == V_ASN1_NULL ||
70
+ a->value.ptr != NULL) {
71
+ return a->type;
72
+ }
73
+ return 0;
73
74
  }
74
75
 
75
- void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value)
76
+ const void *asn1_type_value_as_pointer(const ASN1_TYPE *a)
76
77
  {
77
- if (a->value.ptr != NULL) {
78
- ASN1_TYPE **tmp_a = &a;
79
- ASN1_primitive_free((ASN1_VALUE **)tmp_a, NULL);
78
+ if (a->type == V_ASN1_BOOLEAN) {
79
+ return a->value.boolean ? (void *)0xff : NULL;
80
+ }
81
+ if (a->type == V_ASN1_NULL) {
82
+ return NULL;
80
83
  }
84
+ return a->value.ptr;
85
+ }
86
+
87
+ void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value)
88
+ {
89
+ ASN1_TYPE **tmp_a = &a;
90
+ ASN1_primitive_free((ASN1_VALUE **)tmp_a, NULL);
81
91
  a->type = type;
82
92
  if (type == V_ASN1_BOOLEAN)
83
93
  a->value.boolean = value ? 0xff : 0;
@@ -370,8 +370,7 @@ int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len)
370
370
 
371
371
  void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len)
372
372
  {
373
- if (str->data)
374
- OPENSSL_free(str->data);
373
+ OPENSSL_free(str->data);
375
374
  str->data = data;
376
375
  str->length = len;
377
376
  }
@@ -126,6 +126,11 @@ int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval,
126
126
  int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen,
127
127
  const ASN1_ITEM *it);
128
128
 
129
+ /* asn1_type_value_as_pointer returns |a|'s value in pointer form. This is
130
+ * usually the value object but, for BOOLEAN values, is 0 or 0xff cast to
131
+ * a pointer. */
132
+ const void *asn1_type_value_as_pointer(const ASN1_TYPE *a);
133
+
129
134
 
130
135
  #if defined(__cplusplus)
131
136
  } /* extern C */
@@ -569,7 +569,7 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *putype,
569
569
  if (!*tbool && !it->size)
570
570
  return -1;
571
571
  }
572
- c = (unsigned char)*tbool;
572
+ c = *tbool ? 0xff : 0x00;
573
573
  cont = &c;
574
574
  len = 1;
575
575
  break;
@@ -192,7 +192,7 @@ void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
192
192
  ASN1_TYPE *typ = (ASN1_TYPE *)*pval;
193
193
  utype = typ->type;
194
194
  pval = &typ->value.asn1_value;
195
- if (!*pval)
195
+ if (utype != V_ASN1_BOOLEAN && !*pval)
196
196
  return;
197
197
  } else if (it->itype == ASN1_ITYPE_MSTRING) {
198
198
  utype = -1;
@@ -343,7 +343,7 @@ static int aead_tls_open(const EVP_AEAD_CTX *ctx, uint8_t *out, size_t *out_len,
343
343
  if (EVP_CIPHER_CTX_mode(&tls_ctx->cipher_ctx) == EVP_CIPH_CBC_MODE &&
344
344
  EVP_tls_cbc_record_digest_supported(tls_ctx->hmac_ctx.md)) {
345
345
  if (!EVP_tls_cbc_digest_record(tls_ctx->hmac_ctx.md, mac, &mac_len,
346
- ad_fixed, out, data_plus_mac_len, total,
346
+ ad_fixed, out, data_len, total,
347
347
  tls_ctx->mac_key, tls_ctx->mac_key_len)) {
348
348
  OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
349
349
  return 0;
@@ -406,14 +406,6 @@ static int aead_aes_128_cbc_sha1_tls_implicit_iv_init(
406
406
  EVP_sha1(), 1);
407
407
  }
408
408
 
409
- static int aead_aes_128_cbc_sha256_tls_init(EVP_AEAD_CTX *ctx,
410
- const uint8_t *key, size_t key_len,
411
- size_t tag_len,
412
- enum evp_aead_direction_t dir) {
413
- return aead_tls_init(ctx, key, key_len, tag_len, dir, EVP_aes_128_cbc(),
414
- EVP_sha256(), 0);
415
- }
416
-
417
409
  static int aead_aes_256_cbc_sha1_tls_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
418
410
  size_t key_len, size_t tag_len,
419
411
  enum evp_aead_direction_t dir) {
@@ -428,22 +420,6 @@ static int aead_aes_256_cbc_sha1_tls_implicit_iv_init(
428
420
  EVP_sha1(), 1);
429
421
  }
430
422
 
431
- static int aead_aes_256_cbc_sha256_tls_init(EVP_AEAD_CTX *ctx,
432
- const uint8_t *key, size_t key_len,
433
- size_t tag_len,
434
- enum evp_aead_direction_t dir) {
435
- return aead_tls_init(ctx, key, key_len, tag_len, dir, EVP_aes_256_cbc(),
436
- EVP_sha256(), 0);
437
- }
438
-
439
- static int aead_aes_256_cbc_sha384_tls_init(EVP_AEAD_CTX *ctx,
440
- const uint8_t *key, size_t key_len,
441
- size_t tag_len,
442
- enum evp_aead_direction_t dir) {
443
- return aead_tls_init(ctx, key, key_len, tag_len, dir, EVP_aes_256_cbc(),
444
- EVP_sha384(), 0);
445
- }
446
-
447
423
  static int aead_des_ede3_cbc_sha1_tls_init(EVP_AEAD_CTX *ctx,
448
424
  const uint8_t *key, size_t key_len,
449
425
  size_t tag_len,
@@ -513,23 +489,6 @@ static const EVP_AEAD aead_aes_128_cbc_sha1_tls_implicit_iv = {
513
489
  aead_tls_tag_len,
514
490
  };
515
491
 
516
- static const EVP_AEAD aead_aes_128_cbc_sha256_tls = {
517
- SHA256_DIGEST_LENGTH + 16, // key len (SHA256 + AES128)
518
- 16, // nonce len (IV)
519
- 16 + SHA256_DIGEST_LENGTH, // overhead (padding + SHA256)
520
- SHA256_DIGEST_LENGTH, // max tag length
521
- 0, // seal_scatter_supports_extra_in
522
-
523
- NULL, // init
524
- aead_aes_128_cbc_sha256_tls_init,
525
- aead_tls_cleanup,
526
- aead_tls_open,
527
- aead_tls_seal_scatter,
528
- NULL, // open_gather
529
- NULL, // get_iv
530
- aead_tls_tag_len,
531
- };
532
-
533
492
  static const EVP_AEAD aead_aes_256_cbc_sha1_tls = {
534
493
  SHA_DIGEST_LENGTH + 32, // key len (SHA1 + AES256)
535
494
  16, // nonce len (IV)
@@ -564,40 +523,6 @@ static const EVP_AEAD aead_aes_256_cbc_sha1_tls_implicit_iv = {
564
523
  aead_tls_tag_len,
565
524
  };
566
525
 
567
- static const EVP_AEAD aead_aes_256_cbc_sha256_tls = {
568
- SHA256_DIGEST_LENGTH + 32, // key len (SHA256 + AES256)
569
- 16, // nonce len (IV)
570
- 16 + SHA256_DIGEST_LENGTH, // overhead (padding + SHA256)
571
- SHA256_DIGEST_LENGTH, // max tag length
572
- 0, // seal_scatter_supports_extra_in
573
-
574
- NULL, // init
575
- aead_aes_256_cbc_sha256_tls_init,
576
- aead_tls_cleanup,
577
- aead_tls_open,
578
- aead_tls_seal_scatter,
579
- NULL, // open_gather
580
- NULL, // get_iv
581
- aead_tls_tag_len,
582
- };
583
-
584
- static const EVP_AEAD aead_aes_256_cbc_sha384_tls = {
585
- SHA384_DIGEST_LENGTH + 32, // key len (SHA384 + AES256)
586
- 16, // nonce len (IV)
587
- 16 + SHA384_DIGEST_LENGTH, // overhead (padding + SHA384)
588
- SHA384_DIGEST_LENGTH, // max tag length
589
- 0, // seal_scatter_supports_extra_in
590
-
591
- NULL, // init
592
- aead_aes_256_cbc_sha384_tls_init,
593
- aead_tls_cleanup,
594
- aead_tls_open,
595
- aead_tls_seal_scatter,
596
- NULL, // open_gather
597
- NULL, // get_iv
598
- aead_tls_tag_len,
599
- };
600
-
601
526
  static const EVP_AEAD aead_des_ede3_cbc_sha1_tls = {
602
527
  SHA_DIGEST_LENGTH + 24, // key len (SHA1 + 3DES)
603
528
  8, // nonce len (IV)
@@ -657,10 +582,6 @@ const EVP_AEAD *EVP_aead_aes_128_cbc_sha1_tls_implicit_iv(void) {
657
582
  return &aead_aes_128_cbc_sha1_tls_implicit_iv;
658
583
  }
659
584
 
660
- const EVP_AEAD *EVP_aead_aes_128_cbc_sha256_tls(void) {
661
- return &aead_aes_128_cbc_sha256_tls;
662
- }
663
-
664
585
  const EVP_AEAD *EVP_aead_aes_256_cbc_sha1_tls(void) {
665
586
  return &aead_aes_256_cbc_sha1_tls;
666
587
  }
@@ -669,14 +590,6 @@ const EVP_AEAD *EVP_aead_aes_256_cbc_sha1_tls_implicit_iv(void) {
669
590
  return &aead_aes_256_cbc_sha1_tls_implicit_iv;
670
591
  }
671
592
 
672
- const EVP_AEAD *EVP_aead_aes_256_cbc_sha256_tls(void) {
673
- return &aead_aes_256_cbc_sha256_tls;
674
- }
675
-
676
- const EVP_AEAD *EVP_aead_aes_256_cbc_sha384_tls(void) {
677
- return &aead_aes_256_cbc_sha384_tls;
678
- }
679
-
680
593
  const EVP_AEAD *EVP_aead_des_ede3_cbc_sha1_tls(void) {
681
594
  return &aead_des_ede3_cbc_sha1_tls;
682
595
  }
@@ -99,6 +99,17 @@ void EVP_tls_cbc_copy_mac(uint8_t *out, size_t md_size, const uint8_t *in,
99
99
  // which EVP_tls_cbc_digest_record supports.
100
100
  int EVP_tls_cbc_record_digest_supported(const EVP_MD *md);
101
101
 
102
+ // EVP_sha1_final_with_secret_suffix computes the result of hashing |len| bytes
103
+ // from |in| to |ctx| and writes the resulting hash to |out|. |len| is treated
104
+ // as secret and must be at most |max_len|, which is treated as public. |in|
105
+ // must point to a buffer of at least |max_len| bytes. It returns one on success
106
+ // and zero if inputs are too long.
107
+ //
108
+ // This function is exported for unit tests.
109
+ OPENSSL_EXPORT int EVP_sha1_final_with_secret_suffix(
110
+ SHA_CTX *ctx, uint8_t out[SHA_DIGEST_LENGTH], const uint8_t *in, size_t len,
111
+ size_t max_len);
112
+
102
113
  // EVP_tls_cbc_digest_record computes the MAC of a decrypted, padded TLS
103
114
  // record.
104
115
  //
@@ -108,8 +119,8 @@ int EVP_tls_cbc_record_digest_supported(const EVP_MD *md);
108
119
  // md_out_size: the number of output bytes is written here.
109
120
  // header: the 13-byte, TLS record header.
110
121
  // data: the record data itself
111
- // data_plus_mac_size: the secret, reported length of the data and MAC
112
- // once the padding has been removed.
122
+ // data_size: the secret, reported length of the data once the padding and MAC
123
+ // have been removed.
113
124
  // data_plus_mac_plus_padding_size: the public length of the whole
114
125
  // record, including padding.
115
126
  //
@@ -119,7 +130,7 @@ int EVP_tls_cbc_record_digest_supported(const EVP_MD *md);
119
130
  // padding too. )
120
131
  int EVP_tls_cbc_digest_record(const EVP_MD *md, uint8_t *md_out,
121
132
  size_t *md_out_size, const uint8_t header[13],
122
- const uint8_t *data, size_t data_plus_mac_size,
133
+ const uint8_t *data, size_t data_size,
123
134
  size_t data_plus_mac_plus_padding_size,
124
135
  const uint8_t *mac_secret,
125
136
  unsigned mac_secret_length);
@@ -62,15 +62,6 @@
62
62
  #include "../fipsmodule/cipher/internal.h"
63
63
 
64
64
 
65
- // MAX_HASH_BIT_COUNT_BYTES is the maximum number of bytes in the hash's length
66
- // field. (SHA-384/512 have 128-bit length.)
67
- #define MAX_HASH_BIT_COUNT_BYTES 16
68
-
69
- // MAX_HASH_BLOCK_SIZE is the maximum hash block size that we'll support.
70
- // Currently SHA-384/512 has a 128-byte block size and that's the largest
71
- // supported by TLS.)
72
- #define MAX_HASH_BLOCK_SIZE 128
73
-
74
65
  int EVP_tls_cbc_remove_padding(crypto_word_t *out_padding_ok, size_t *out_len,
75
66
  const uint8_t *in, size_t in_len,
76
67
  size_t block_size, size_t mac_size) {
@@ -183,134 +174,110 @@ void EVP_tls_cbc_copy_mac(uint8_t *out, size_t md_size, const uint8_t *in,
183
174
  OPENSSL_memcpy(out, rotated_mac, md_size);
184
175
  }
185
176
 
186
- // u32toBE serialises an unsigned, 32-bit number (n) as four bytes at (p) in
187
- // big-endian order. The value of p is advanced by four.
188
- #define u32toBE(n, p) \
189
- do { \
190
- *((p)++) = (uint8_t)((n) >> 24); \
191
- *((p)++) = (uint8_t)((n) >> 16); \
192
- *((p)++) = (uint8_t)((n) >> 8); \
193
- *((p)++) = (uint8_t)((n)); \
194
- } while (0)
195
-
196
- // u64toBE serialises an unsigned, 64-bit number (n) as eight bytes at (p) in
197
- // big-endian order. The value of p is advanced by eight.
198
- #define u64toBE(n, p) \
199
- do { \
200
- *((p)++) = (uint8_t)((n) >> 56); \
201
- *((p)++) = (uint8_t)((n) >> 48); \
202
- *((p)++) = (uint8_t)((n) >> 40); \
203
- *((p)++) = (uint8_t)((n) >> 32); \
204
- *((p)++) = (uint8_t)((n) >> 24); \
205
- *((p)++) = (uint8_t)((n) >> 16); \
206
- *((p)++) = (uint8_t)((n) >> 8); \
207
- *((p)++) = (uint8_t)((n)); \
208
- } while (0)
209
-
210
- typedef union {
211
- SHA_CTX sha1;
212
- SHA256_CTX sha256;
213
- SHA512_CTX sha512;
214
- } HASH_CTX;
215
-
216
- static void tls1_sha1_transform(HASH_CTX *ctx, const uint8_t *block) {
217
- SHA1_Transform(&ctx->sha1, block);
218
- }
177
+ int EVP_sha1_final_with_secret_suffix(SHA_CTX *ctx,
178
+ uint8_t out[SHA_DIGEST_LENGTH],
179
+ const uint8_t *in, size_t len,
180
+ size_t max_len) {
181
+ // Bound the input length so |total_bits| below fits in four bytes. This is
182
+ // redundant with TLS record size limits. This also ensures |input_idx| below
183
+ // does not overflow.
184
+ size_t max_len_bits = max_len << 3;
185
+ if (ctx->Nh != 0 ||
186
+ (max_len_bits >> 3) != max_len || // Overflow
187
+ ctx->Nl + max_len_bits < max_len_bits ||
188
+ ctx->Nl + max_len_bits > UINT32_MAX) {
189
+ return 0;
190
+ }
219
191
 
220
- static void tls1_sha256_transform(HASH_CTX *ctx, const uint8_t *block) {
221
- SHA256_Transform(&ctx->sha256, block);
222
- }
192
+ // We need to hash the following into |ctx|:
193
+ //
194
+ // - ctx->data[:ctx->num]
195
+ // - in[:len]
196
+ // - A 0x80 byte
197
+ // - However many zero bytes are needed to pad up to a block.
198
+ // - Eight bytes of length.
199
+ size_t num_blocks = (ctx->num + len + 1 + 8 + SHA_CBLOCK - 1) >> 6;
200
+ size_t last_block = num_blocks - 1;
201
+ size_t max_blocks = (ctx->num + max_len + 1 + 8 + SHA_CBLOCK - 1) >> 6;
202
+
203
+ // The bounds above imply |total_bits| fits in four bytes.
204
+ size_t total_bits = ctx->Nl + (len << 3);
205
+ uint8_t length_bytes[4];
206
+ length_bytes[0] = (uint8_t)(total_bits >> 24);
207
+ length_bytes[1] = (uint8_t)(total_bits >> 16);
208
+ length_bytes[2] = (uint8_t)(total_bits >> 8);
209
+ length_bytes[3] = (uint8_t)total_bits;
210
+
211
+ // We now construct and process each expected block in constant-time.
212
+ uint8_t block[SHA_CBLOCK] = {0};
213
+ uint32_t result[5] = {0};
214
+ // input_idx is the index into |in| corresponding to the current block.
215
+ // However, we allow this index to overflow beyond |max_len|, to simplify the
216
+ // 0x80 byte.
217
+ size_t input_idx = 0;
218
+ for (size_t i = 0; i < max_blocks; i++) {
219
+ // Fill |block| with data from the partial block in |ctx| and |in|. We copy
220
+ // as if we were hashing up to |max_len| and then zero the excess later.
221
+ size_t block_start = 0;
222
+ if (i == 0) {
223
+ OPENSSL_memcpy(block, ctx->data, ctx->num);
224
+ block_start = ctx->num;
225
+ }
226
+ if (input_idx < max_len) {
227
+ size_t to_copy = SHA_CBLOCK - block_start;
228
+ if (to_copy > max_len - input_idx) {
229
+ to_copy = max_len - input_idx;
230
+ }
231
+ OPENSSL_memcpy(block + block_start, in + input_idx, to_copy);
232
+ }
223
233
 
224
- static void tls1_sha512_transform(HASH_CTX *ctx, const uint8_t *block) {
225
- SHA512_Transform(&ctx->sha512, block);
226
- }
234
+ // Zero any bytes beyond |len| and add the 0x80 byte.
235
+ for (size_t j = block_start; j < SHA_CBLOCK; j++) {
236
+ // input[idx] corresponds to block[j].
237
+ size_t idx = input_idx + j - block_start;
238
+ // The barriers on |len| are not strictly necessary. However, without
239
+ // them, GCC compiles this code by incorporating |len| into the loop
240
+ // counter and subtracting it out later. This is still constant-time, but
241
+ // it frustrates attempts to validate this.
242
+ uint8_t is_in_bounds = constant_time_lt_8(idx, value_barrier_w(len));
243
+ uint8_t is_padding_byte = constant_time_eq_8(idx, value_barrier_w(len));
244
+ block[j] &= is_in_bounds;
245
+ block[j] |= 0x80 & is_padding_byte;
246
+ }
227
247
 
228
- // These functions serialize the state of a hash and thus perform the standard
229
- // "final" operation without adding the padding and length that such a function
230
- // typically does.
231
- static void tls1_sha1_final_raw(HASH_CTX *ctx, uint8_t *md_out) {
232
- SHA_CTX *sha1 = &ctx->sha1;
233
- u32toBE(sha1->h[0], md_out);
234
- u32toBE(sha1->h[1], md_out);
235
- u32toBE(sha1->h[2], md_out);
236
- u32toBE(sha1->h[3], md_out);
237
- u32toBE(sha1->h[4], md_out);
238
- }
248
+ input_idx += SHA_CBLOCK - block_start;
239
249
 
240
- static void tls1_sha256_final_raw(HASH_CTX *ctx, uint8_t *md_out) {
241
- SHA256_CTX *sha256 = &ctx->sha256;
242
- for (unsigned i = 0; i < 8; i++) {
243
- u32toBE(sha256->h[i], md_out);
250
+ // Fill in the length if this is the last block.
251
+ crypto_word_t is_last_block = constant_time_eq_w(i, last_block);
252
+ for (size_t j = 0; j < 4; j++) {
253
+ block[SHA_CBLOCK - 4 + j] |= is_last_block & length_bytes[j];
254
+ }
255
+
256
+ // Process the block and save the hash state if it is the final value.
257
+ SHA1_Transform(ctx, block);
258
+ for (size_t j = 0; j < 5; j++) {
259
+ result[j] |= is_last_block & ctx->h[j];
260
+ }
244
261
  }
245
- }
246
262
 
247
- static void tls1_sha512_final_raw(HASH_CTX *ctx, uint8_t *md_out) {
248
- SHA512_CTX *sha512 = &ctx->sha512;
249
- for (unsigned i = 0; i < 8; i++) {
250
- u64toBE(sha512->h[i], md_out);
263
+ // Write the output.
264
+ for (size_t i = 0; i < 5; i++) {
265
+ CRYPTO_store_u32_be(out + 4 * i, result[i]);
251
266
  }
267
+ return 1;
252
268
  }
253
269
 
254
270
  int EVP_tls_cbc_record_digest_supported(const EVP_MD *md) {
255
- switch (EVP_MD_type(md)) {
256
- case NID_sha1:
257
- case NID_sha256:
258
- case NID_sha384:
259
- return 1;
260
-
261
- default:
262
- return 0;
263
- }
271
+ return EVP_MD_type(md) == NID_sha1;
264
272
  }
265
273
 
266
274
  int EVP_tls_cbc_digest_record(const EVP_MD *md, uint8_t *md_out,
267
275
  size_t *md_out_size, const uint8_t header[13],
268
- const uint8_t *data, size_t data_plus_mac_size,
276
+ const uint8_t *data, size_t data_size,
269
277
  size_t data_plus_mac_plus_padding_size,
270
278
  const uint8_t *mac_secret,
271
279
  unsigned mac_secret_length) {
272
- HASH_CTX md_state;
273
- void (*md_final_raw)(HASH_CTX *ctx, uint8_t *md_out);
274
- void (*md_transform)(HASH_CTX *ctx, const uint8_t *block);
275
- unsigned md_size, md_block_size = 64, md_block_shift = 6;
276
- // md_length_size is the number of bytes in the length field that terminates
277
- // the hash.
278
- unsigned md_length_size = 8;
279
-
280
- // Bound the acceptable input so we can forget about many possible overflows
281
- // later in this function. This is redundant with the record size limits in
282
- // TLS.
283
- if (data_plus_mac_plus_padding_size >= 1024 * 1024) {
284
- assert(0);
285
- return 0;
286
- }
287
-
288
- switch (EVP_MD_type(md)) {
289
- case NID_sha1:
290
- SHA1_Init(&md_state.sha1);
291
- md_final_raw = tls1_sha1_final_raw;
292
- md_transform = tls1_sha1_transform;
293
- md_size = SHA_DIGEST_LENGTH;
294
- break;
295
-
296
- case NID_sha256:
297
- SHA256_Init(&md_state.sha256);
298
- md_final_raw = tls1_sha256_final_raw;
299
- md_transform = tls1_sha256_transform;
300
- md_size = SHA256_DIGEST_LENGTH;
301
- break;
302
-
303
- case NID_sha384:
304
- SHA384_Init(&md_state.sha512);
305
- md_final_raw = tls1_sha512_final_raw;
306
- md_transform = tls1_sha512_transform;
307
- md_size = SHA384_DIGEST_LENGTH;
308
- md_block_size = 128;
309
- md_block_shift = 7;
310
- md_length_size = 16;
311
- break;
312
-
313
- default:
280
+ if (EVP_MD_type(md) != NID_sha1) {
314
281
  // EVP_tls_cbc_record_digest_supported should have been called first to
315
282
  // check that the hash function is supported.
316
283
  assert(0);
@@ -318,175 +285,54 @@ int EVP_tls_cbc_digest_record(const EVP_MD *md, uint8_t *md_out,
318
285
  return 0;
319
286
  }
320
287
 
321
- assert(md_length_size <= MAX_HASH_BIT_COUNT_BYTES);
322
- assert(md_block_size <= MAX_HASH_BLOCK_SIZE);
323
- assert(md_block_size == (1u << md_block_shift));
324
- assert(md_size <= EVP_MAX_MD_SIZE);
325
-
326
- static const size_t kHeaderLength = 13;
327
-
328
- // kVarianceBlocks is the number of blocks of the hash that we have to
329
- // calculate in constant time because they could be altered by the
330
- // padding value.
331
- //
332
- // TLSv1 has MACs up to 48 bytes long (SHA-384) and the padding is not
333
- // required to be minimal. Therefore we say that the final |kVarianceBlocks|
334
- // blocks can vary based on the padding and on the hash used. This value
335
- // must be derived from public information.
336
- const size_t kVarianceBlocks =
337
- ( 255 + 1 + // maximum padding bytes + padding length
338
- md_size + // length of hash's output
339
- md_block_size - 1 // ceiling
340
- ) / md_block_size
341
- + 1; // the 0x80 marker and the encoded message length could or not
342
- // require an extra block; since the exact value depends on the
343
- // message length; thus, one extra block is always added to run
344
- // in constant time.
345
-
346
- // From now on we're dealing with the MAC, which conceptually has 13
347
- // bytes of `header' before the start of the data.
348
- size_t len = data_plus_mac_plus_padding_size + kHeaderLength;
349
- // max_mac_bytes contains the maximum bytes of bytes in the MAC, including
350
- // |header|, assuming that there's no padding.
351
- size_t max_mac_bytes = len - md_size - 1;
352
- // num_blocks is the maximum number of hash blocks.
353
- size_t num_blocks =
354
- (max_mac_bytes + 1 + md_length_size + md_block_size - 1) / md_block_size;
355
- // In order to calculate the MAC in constant time we have to handle
356
- // the final blocks specially because the padding value could cause the
357
- // end to appear somewhere in the final |kVarianceBlocks| blocks and we
358
- // can't leak where. However, |num_starting_blocks| worth of data can
359
- // be hashed right away because no padding value can affect whether
360
- // they are plaintext.
361
- size_t num_starting_blocks = 0;
362
- // k is the starting byte offset into the conceptual header||data where
363
- // we start processing.
364
- size_t k = 0;
365
- // mac_end_offset is the index just past the end of the data to be MACed.
366
- size_t mac_end_offset = data_plus_mac_size + kHeaderLength - md_size;
367
- // c is the index of the 0x80 byte in the final hash block that contains
368
- // application data.
369
- size_t c = mac_end_offset & (md_block_size - 1);
370
- // index_a is the hash block number that contains the 0x80 terminating value.
371
- size_t index_a = mac_end_offset >> md_block_shift;
372
- // index_b is the hash block number that contains the 64-bit hash length, in
373
- // bits.
374
- size_t index_b = (mac_end_offset + md_length_size) >> md_block_shift;
375
-
376
- if (num_blocks > kVarianceBlocks) {
377
- num_starting_blocks = num_blocks - kVarianceBlocks;
378
- k = md_block_size * num_starting_blocks;
288
+ if (mac_secret_length > SHA_CBLOCK) {
289
+ // HMAC pads small keys with zeros and hashes large keys down. This function
290
+ // should never reach the large key case.
291
+ assert(0);
292
+ return 0;
379
293
  }
380
294
 
381
- // bits is the hash-length in bits. It includes the additional hash
382
- // block for the masked HMAC key.
383
- size_t bits = 8 * mac_end_offset; // at most 18 bits to represent
384
-
385
295
  // Compute the initial HMAC block.
386
- bits += 8 * md_block_size;
387
- // hmac_pad is the masked HMAC key.
388
- uint8_t hmac_pad[MAX_HASH_BLOCK_SIZE];
389
- OPENSSL_memset(hmac_pad, 0, md_block_size);
390
- assert(mac_secret_length <= sizeof(hmac_pad));
296
+ uint8_t hmac_pad[SHA_CBLOCK];
297
+ OPENSSL_memset(hmac_pad, 0, sizeof(hmac_pad));
391
298
  OPENSSL_memcpy(hmac_pad, mac_secret, mac_secret_length);
392
- for (size_t i = 0; i < md_block_size; i++) {
299
+ for (size_t i = 0; i < SHA_CBLOCK; i++) {
393
300
  hmac_pad[i] ^= 0x36;
394
301
  }
395
302
 
396
- md_transform(&md_state, hmac_pad);
397
-
398
- // The length check means |bits| fits in four bytes.
399
- uint8_t length_bytes[MAX_HASH_BIT_COUNT_BYTES];
400
- OPENSSL_memset(length_bytes, 0, md_length_size - 4);
401
- length_bytes[md_length_size - 4] = (uint8_t)(bits >> 24);
402
- length_bytes[md_length_size - 3] = (uint8_t)(bits >> 16);
403
- length_bytes[md_length_size - 2] = (uint8_t)(bits >> 8);
404
- length_bytes[md_length_size - 1] = (uint8_t)bits;
405
-
406
- if (k > 0) {
407
- // k is a multiple of md_block_size.
408
- uint8_t first_block[MAX_HASH_BLOCK_SIZE];
409
- OPENSSL_memcpy(first_block, header, 13);
410
- OPENSSL_memcpy(first_block + 13, data, md_block_size - 13);
411
- md_transform(&md_state, first_block);
412
- for (size_t i = 1; i < k / md_block_size; i++) {
413
- md_transform(&md_state, data + md_block_size * i - 13);
414
- }
415
- }
416
-
417
- uint8_t mac_out[EVP_MAX_MD_SIZE];
418
- OPENSSL_memset(mac_out, 0, sizeof(mac_out));
419
-
420
- // We now process the final hash blocks. For each block, we construct
421
- // it in constant time. If the |i==index_a| then we'll include the 0x80
422
- // bytes and zero pad etc. For each block we selectively copy it, in
423
- // constant time, to |mac_out|.
424
- for (size_t i = num_starting_blocks;
425
- i <= num_starting_blocks + kVarianceBlocks; i++) {
426
- uint8_t block[MAX_HASH_BLOCK_SIZE];
427
- uint8_t is_block_a = constant_time_eq_8(i, index_a);
428
- uint8_t is_block_b = constant_time_eq_8(i, index_b);
429
- for (size_t j = 0; j < md_block_size; j++) {
430
- uint8_t b = 0;
431
- if (k < kHeaderLength) {
432
- b = header[k];
433
- } else if (k < data_plus_mac_plus_padding_size + kHeaderLength) {
434
- b = data[k - kHeaderLength];
435
- }
436
- k++;
437
-
438
- uint8_t is_past_c = is_block_a & constant_time_ge_8(j, c);
439
- uint8_t is_past_cp1 = is_block_a & constant_time_ge_8(j, c + 1);
440
- // If this is the block containing the end of the
441
- // application data, and we are at the offset for the
442
- // 0x80 value, then overwrite b with 0x80.
443
- b = constant_time_select_8(is_past_c, 0x80, b);
444
- // If this the the block containing the end of the
445
- // application data and we're past the 0x80 value then
446
- // just write zero.
447
- b = b & ~is_past_cp1;
448
- // If this is index_b (the final block), but not
449
- // index_a (the end of the data), then the 64-bit
450
- // length didn't fit into index_a and we're having to
451
- // add an extra block of zeros.
452
- b &= ~is_block_b | is_block_a;
453
-
454
- // The final bytes of one of the blocks contains the
455
- // length.
456
- if (j >= md_block_size - md_length_size) {
457
- // If this is index_b, write a length byte.
458
- b = constant_time_select_8(
459
- is_block_b, length_bytes[j - (md_block_size - md_length_size)], b);
460
- }
461
- block[j] = b;
462
- }
303
+ SHA_CTX ctx;
304
+ SHA1_Init(&ctx);
305
+ SHA1_Update(&ctx, hmac_pad, SHA_CBLOCK);
306
+ SHA1_Update(&ctx, header, 13);
463
307
 
464
- md_transform(&md_state, block);
465
- md_final_raw(&md_state, block);
466
- // If this is index_b, copy the hash value to |mac_out|.
467
- for (size_t j = 0; j < md_size; j++) {
468
- mac_out[j] |= block[j] & is_block_b;
469
- }
308
+ // There are at most 256 bytes of padding, so we can compute the public
309
+ // minimum length for |data_size|.
310
+ size_t min_data_size = 0;
311
+ if (data_plus_mac_plus_padding_size > SHA_DIGEST_LENGTH + 256) {
312
+ min_data_size = data_plus_mac_plus_padding_size - SHA_DIGEST_LENGTH - 256;
470
313
  }
471
314
 
472
- EVP_MD_CTX md_ctx;
473
- EVP_MD_CTX_init(&md_ctx);
474
- if (!EVP_DigestInit_ex(&md_ctx, md, NULL /* engine */)) {
475
- EVP_MD_CTX_cleanup(&md_ctx);
315
+ // Hash the public minimum length directly. This reduces the number of blocks
316
+ // that must be computed in constant-time.
317
+ SHA1_Update(&ctx, data, min_data_size);
318
+
319
+ // Hash the remaining data without leaking |data_size|.
320
+ uint8_t mac_out[SHA_DIGEST_LENGTH];
321
+ if (!EVP_sha1_final_with_secret_suffix(
322
+ &ctx, mac_out, data + min_data_size, data_size - min_data_size,
323
+ data_plus_mac_plus_padding_size - min_data_size)) {
476
324
  return 0;
477
325
  }
478
326
 
479
327
  // Complete the HMAC in the standard manner.
480
- for (size_t i = 0; i < md_block_size; i++) {
328
+ SHA1_Init(&ctx);
329
+ for (size_t i = 0; i < SHA_CBLOCK; i++) {
481
330
  hmac_pad[i] ^= 0x6a;
482
331
  }
483
332
 
484
- EVP_DigestUpdate(&md_ctx, hmac_pad, md_block_size);
485
- EVP_DigestUpdate(&md_ctx, mac_out, md_size);
486
- unsigned md_out_size_u;
487
- EVP_DigestFinal(&md_ctx, md_out, &md_out_size_u);
488
- *md_out_size = md_out_size_u;
489
- EVP_MD_CTX_cleanup(&md_ctx);
490
-
333
+ SHA1_Update(&ctx, hmac_pad, SHA_CBLOCK);
334
+ SHA1_Update(&ctx, mac_out, SHA_DIGEST_LENGTH);
335
+ SHA1_Final(md_out, &ctx);
336
+ *md_out_size = SHA_DIGEST_LENGTH;
491
337
  return 1;
492
338
  }