grpc 1.41.1 → 1.42.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 (416) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +55 -43
  3. data/include/grpc/event_engine/event_engine.h +82 -42
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  5. data/include/grpc/event_engine/memory_allocator.h +210 -0
  6. data/include/grpc/grpc.h +4 -0
  7. data/include/grpc/grpc_security.h +18 -0
  8. data/include/grpc/grpc_security_constants.h +1 -0
  9. data/include/grpc/impl/codegen/port_platform.h +7 -0
  10. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  11. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  12. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  13. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  14. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  15. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  17. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  18. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  20. data/src/core/ext/filters/client_channel/connector.h +18 -18
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  23. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  24. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  42. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  43. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  44. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  49. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  50. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  52. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  53. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  54. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  55. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  58. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  59. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  60. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  62. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  63. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  64. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  66. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  67. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  68. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  69. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  74. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  75. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  76. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  77. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  78. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  79. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  80. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  81. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  82. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  84. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  85. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  87. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  88. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  89. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  90. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  91. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  92. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  93. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  94. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  96. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  98. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  99. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  103. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  107. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  108. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  109. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  110. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  112. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  114. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  120. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  121. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  123. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  125. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  127. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  128. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  130. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  131. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  138. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  139. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  140. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  142. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  146. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  147. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  148. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  153. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  155. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  161. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  163. data/src/core/ext/xds/xds_api.cc +325 -362
  164. data/src/core/ext/xds/xds_api.h +134 -82
  165. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  166. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  167. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  168. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  169. data/src/core/ext/xds/xds_client.cc +527 -314
  170. data/src/core/ext/xds/xds_client.h +42 -37
  171. data/src/core/ext/xds/xds_client_stats.h +1 -1
  172. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  173. data/src/core/lib/address_utils/parse_address.cc +2 -0
  174. data/src/core/lib/avl/avl.cc +5 -5
  175. data/src/core/lib/backoff/backoff.cc +1 -1
  176. data/src/core/lib/channel/channel_args.cc +24 -6
  177. data/src/core/lib/channel/channel_args.h +9 -0
  178. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  179. data/src/core/lib/channel/channel_trace.cc +1 -1
  180. data/src/core/lib/channel/channel_trace.h +1 -1
  181. data/src/core/lib/channel/channelz.cc +3 -3
  182. data/src/core/lib/channel/channelz.h +2 -2
  183. data/src/core/lib/channel/channelz_registry.cc +1 -1
  184. data/src/core/lib/channel/channelz_registry.h +1 -1
  185. data/src/core/lib/channel/connected_channel.cc +1 -3
  186. data/src/core/lib/channel/connected_channel.h +1 -2
  187. data/src/core/lib/compression/compression.cc +2 -2
  188. data/src/core/lib/compression/compression_args.cc +6 -4
  189. data/src/core/lib/compression/compression_internal.cc +2 -2
  190. data/src/core/lib/compression/compression_internal.h +1 -1
  191. data/src/core/lib/config/core_configuration.cc +44 -2
  192. data/src/core/lib/config/core_configuration.h +39 -1
  193. data/src/core/lib/debug/stats.cc +1 -1
  194. data/src/core/lib/debug/stats_data.cc +13 -13
  195. data/src/core/lib/gpr/atm.cc +1 -1
  196. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  197. data/src/core/lib/gpr/string.cc +2 -2
  198. data/src/core/lib/gpr/tls.h +1 -1
  199. data/src/core/lib/gpr/useful.h +79 -32
  200. data/src/core/lib/gprpp/arena.h +10 -0
  201. data/src/core/lib/gprpp/bitset.h +38 -16
  202. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  203. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  204. data/src/core/lib/gprpp/match.h +1 -1
  205. data/src/core/lib/gprpp/memory.h +6 -0
  206. data/src/core/lib/gprpp/overload.h +1 -1
  207. data/src/core/lib/gprpp/status_helper.cc +23 -3
  208. data/src/core/lib/gprpp/status_helper.h +12 -1
  209. data/src/core/lib/gprpp/table.h +411 -0
  210. data/src/core/lib/http/httpcli.cc +200 -182
  211. data/src/core/lib/http/parser.cc +2 -2
  212. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  213. data/src/core/lib/iomgr/combiner.cc +6 -21
  214. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  215. data/src/core/lib/iomgr/error.cc +113 -52
  216. data/src/core/lib/iomgr/error.h +50 -9
  217. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  218. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  219. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  220. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  221. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  222. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  223. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  224. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  225. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  226. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  227. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  228. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  229. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  230. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  231. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  232. data/src/core/lib/iomgr/executor.cc +6 -20
  233. data/src/core/lib/iomgr/iomgr.cc +3 -1
  234. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  235. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  236. data/src/core/lib/iomgr/load_file.cc +2 -2
  237. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  238. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  239. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  240. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  241. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  242. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  243. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  244. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  246. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  247. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  249. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  250. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  251. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  252. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  253. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  254. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  255. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  256. data/src/core/lib/json/json_util.cc +68 -0
  257. data/src/core/lib/json/json_util.h +57 -99
  258. data/src/core/lib/json/json_writer.cc +0 -3
  259. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  260. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  261. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  262. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  263. data/src/core/lib/security/context/security_context.cc +4 -2
  264. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  265. data/src/core/lib/security/credentials/credentials.cc +4 -2
  266. data/src/core/lib/security/credentials/credentials.h +6 -1
  267. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  268. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  269. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  270. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  271. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  272. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  273. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  274. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  275. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  276. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  278. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  279. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  280. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  281. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  282. data/src/core/lib/slice/slice.cc +0 -16
  283. data/src/core/lib/slice/slice_api.cc +39 -0
  284. data/src/core/lib/slice/slice_buffer.cc +5 -5
  285. data/src/core/lib/slice/slice_intern.cc +8 -13
  286. data/src/core/lib/slice/slice_internal.h +1 -244
  287. data/src/core/lib/slice/slice_refcount.cc +17 -0
  288. data/src/core/lib/slice/slice_refcount.h +121 -0
  289. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  290. data/src/core/lib/slice/slice_split.cc +100 -0
  291. data/src/core/lib/slice/slice_split.h +40 -0
  292. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  293. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  294. data/src/core/lib/slice/static_slice.cc +529 -0
  295. data/src/core/lib/slice/static_slice.h +331 -0
  296. data/src/core/lib/surface/builtins.cc +49 -0
  297. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  298. data/src/core/lib/surface/call.cc +103 -120
  299. data/src/core/lib/surface/call.h +0 -6
  300. data/src/core/lib/surface/channel.cc +19 -32
  301. data/src/core/lib/surface/channel.h +0 -9
  302. data/src/core/lib/surface/channel_init.cc +23 -76
  303. data/src/core/lib/surface/channel_init.h +52 -44
  304. data/src/core/lib/surface/completion_queue.cc +6 -5
  305. data/src/core/lib/surface/init.cc +0 -39
  306. data/src/core/lib/surface/init_secure.cc +17 -14
  307. data/src/core/lib/surface/lame_client.cc +18 -11
  308. data/src/core/lib/surface/lame_client.h +1 -1
  309. data/src/core/lib/surface/server.cc +25 -17
  310. data/src/core/lib/surface/server.h +17 -10
  311. data/src/core/lib/surface/validate_metadata.cc +5 -2
  312. data/src/core/lib/surface/version.cc +2 -2
  313. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  314. data/src/core/lib/transport/error_utils.cc +42 -17
  315. data/src/core/lib/transport/error_utils.h +1 -1
  316. data/src/core/lib/transport/metadata.cc +31 -10
  317. data/src/core/lib/transport/metadata.h +2 -1
  318. data/src/core/lib/transport/metadata_batch.cc +35 -371
  319. data/src/core/lib/transport/metadata_batch.h +905 -71
  320. data/src/core/lib/transport/parsed_metadata.h +263 -0
  321. data/src/core/lib/transport/pid_controller.cc +4 -4
  322. data/src/core/lib/transport/static_metadata.cc +714 -846
  323. data/src/core/lib/transport/static_metadata.h +115 -379
  324. data/src/core/lib/transport/status_metadata.cc +1 -0
  325. data/src/core/lib/transport/transport.cc +4 -5
  326. data/src/core/lib/transport/transport_op_string.cc +40 -20
  327. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  328. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  329. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  330. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  331. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  332. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  335. data/src/core/tsi/fake_transport_security.cc +15 -7
  336. data/src/core/tsi/local_transport_security.cc +36 -73
  337. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  339. data/src/core/tsi/ssl_transport_security.cc +10 -2
  340. data/src/core/tsi/transport_security.cc +12 -0
  341. data/src/core/tsi/transport_security.h +16 -1
  342. data/src/core/tsi/transport_security_interface.h +26 -0
  343. data/src/ruby/ext/grpc/extconf.rb +12 -9
  344. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  346. data/src/ruby/lib/grpc/version.rb +1 -1
  347. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  348. data/src/ruby/spec/client_server_spec.rb +1 -1
  349. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  351. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  352. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +20 -21
  353. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +104 -114
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +13 -0
  355. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  356. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  357. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  358. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  359. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  360. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  361. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +3 -6
  362. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  363. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  364. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  365. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  366. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  368. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +0 -1
  369. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +72 -45
  370. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
  371. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +2 -2
  372. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +479 -15
  373. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -564
  374. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +0 -1
  375. data/third_party/re2/re2/compile.cc +91 -109
  376. data/third_party/re2/re2/dfa.cc +27 -39
  377. data/third_party/re2/re2/filtered_re2.cc +18 -2
  378. data/third_party/re2/re2/filtered_re2.h +10 -5
  379. data/third_party/re2/re2/nfa.cc +1 -1
  380. data/third_party/re2/re2/parse.cc +42 -23
  381. data/third_party/re2/re2/perl_groups.cc +34 -34
  382. data/third_party/re2/re2/prefilter.cc +3 -2
  383. data/third_party/re2/re2/prog.cc +182 -4
  384. data/third_party/re2/re2/prog.h +28 -9
  385. data/third_party/re2/re2/re2.cc +87 -118
  386. data/third_party/re2/re2/re2.h +156 -141
  387. data/third_party/re2/re2/regexp.cc +12 -5
  388. data/third_party/re2/re2/regexp.h +8 -2
  389. data/third_party/re2/re2/set.cc +31 -9
  390. data/third_party/re2/re2/set.h +9 -4
  391. data/third_party/re2/re2/simplify.cc +11 -3
  392. data/third_party/re2/re2/tostring.cc +1 -1
  393. data/third_party/re2/re2/walker-inl.h +1 -1
  394. data/third_party/re2/util/mutex.h +2 -2
  395. data/third_party/re2/util/pcre.h +3 -3
  396. metadata +78 -66
  397. data/include/grpc/event_engine/slice_allocator.h +0 -71
  398. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  399. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  400. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  401. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  402. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  403. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  404. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  405. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  406. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  407. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  408. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  409. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  410. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  411. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  412. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  413. data/src/core/lib/iomgr/udp_server.cc +0 -747
  414. data/src/core/lib/iomgr/udp_server.h +0 -103
  415. data/src/core/lib/transport/authority_override.cc +0 -40
  416. data/src/core/lib/transport/authority_override.h +0 -37
@@ -311,7 +311,7 @@ shared_examples 'basic GRPC message delivery is OK' do
311
311
 
312
312
  it 'clients can cancel a call on the server' do
313
313
  expected_code = StatusCodes::CANCELLED
314
- expected_details = 'Cancelled'
314
+ expected_details = 'CANCELLED'
315
315
  cancel_proc = proc { |call| call.cancel }
316
316
  client_cancel_test(cancel_proc, expected_code, expected_details)
317
317
  end
@@ -120,10 +120,10 @@ void SetCurrentThreadIdentity(
120
120
  ABSL_THREAD_IDENTITY_MODE == ABSL_THREAD_IDENTITY_MODE_USE_CPP11
121
121
 
122
122
  // Please see the comment on `CurrentThreadIdentityIfPresent` in
123
- // thread_identity.h. Because DLLs cannot expose thread_local variables in
124
- // headers, we opt for the correct-but-slower option of placing the definition
125
- // of this function only in a translation unit inside DLL.
126
- #if defined(ABSL_BUILD_DLL) || defined(ABSL_CONSUME_DLL)
123
+ // thread_identity.h. When we cannot expose thread_local variables in
124
+ // headers, we opt for the correct-but-slower option of not inlining this
125
+ // function.
126
+ #ifndef ABSL_INTERNAL_INLINE_CURRENT_THREAD_IDENTITY_IF_PRESENT
127
127
  ThreadIdentity* CurrentThreadIdentityIfPresent() { return thread_identity_ptr; }
128
128
  #endif
129
129
  #endif
@@ -236,13 +236,18 @@ ABSL_CONST_INIT extern thread_local ThreadIdentity* thread_identity_ptr;
236
236
  #error Thread-local storage not detected on this platform
237
237
  #endif
238
238
 
239
- // thread_local variables cannot be in headers exposed by DLLs. However, it is
240
- // important for performance reasons in general that
241
- // `CurrentThreadIdentityIfPresent` be inlined. This is not possible across a
242
- // DLL boundary so, with DLLs, we opt to have the function not be inlined. Note
239
+ // thread_local variables cannot be in headers exposed by DLLs or in certain
240
+ // build configurations on Apple platforms. However, it is important for
241
+ // performance reasons in general that `CurrentThreadIdentityIfPresent` be
242
+ // inlined. In the other cases we opt to have the function not be inlined. Note
243
243
  // that `CurrentThreadIdentityIfPresent` is declared above so we can exclude
244
- // this entire inline definition when compiling as a DLL.
245
- #if !defined(ABSL_BUILD_DLL) && !defined(ABSL_CONSUME_DLL)
244
+ // this entire inline definition.
245
+ #if !defined(__APPLE__) && !defined(ABSL_BUILD_DLL) && \
246
+ !defined(ABSL_CONSUME_DLL)
247
+ #define ABSL_INTERNAL_INLINE_CURRENT_THREAD_IDENTITY_IF_PRESENT 1
248
+ #endif
249
+
250
+ #ifdef ABSL_INTERNAL_INLINE_CURRENT_THREAD_IDENTITY_IF_PRESENT
246
251
  inline ThreadIdentity* CurrentThreadIdentityIfPresent() {
247
252
  return thread_identity_ptr;
248
253
  }
@@ -54,6 +54,7 @@ static bool posix_source_addr_factory_get_source_addr(
54
54
  address_sorting_source_addr_factory* factory,
55
55
  const address_sorting_address* dest_addr,
56
56
  address_sorting_address* source_addr) {
57
+ (void)factory;
57
58
  bool source_addr_exists = false;
58
59
  // Android sets SOCK_CLOEXEC. Don't set this here for portability.
59
60
  int s = socket(((struct sockaddr*)dest_addr)->sa_family, SOCK_DGRAM, 0);
@@ -59,7 +59,7 @@
59
59
  #include <openssl/err.h>
60
60
  #include <openssl/mem.h>
61
61
 
62
- int i2d_ASN1_BOOLEAN(int a, unsigned char **pp)
62
+ int i2d_ASN1_BOOLEAN(ASN1_BOOLEAN a, unsigned char **pp)
63
63
  {
64
64
  int r;
65
65
  unsigned char *p, *allocated = NULL;
@@ -88,36 +88,35 @@ int i2d_ASN1_BOOLEAN(int a, unsigned char **pp)
88
88
  return r;
89
89
  }
90
90
 
91
- int d2i_ASN1_BOOLEAN(int *a, const unsigned char **pp, long length)
92
- {
93
- int ret = -1;
94
- const unsigned char *p;
91
+ ASN1_BOOLEAN d2i_ASN1_BOOLEAN(ASN1_BOOLEAN *a, const unsigned char **pp,
92
+ long length) {
93
+ const unsigned char *p = *pp;
95
94
  long len;
96
95
  int inf, tag, xclass;
97
- int i = 0;
98
-
99
- p = *pp;
100
96
  inf = ASN1_get_object(&p, &len, &tag, &xclass, length);
101
97
  if (inf & 0x80) {
102
- i = ASN1_R_BAD_OBJECT_HEADER;
103
- goto err;
98
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER);
99
+ return -1;
104
100
  }
105
101
 
106
- if (tag != V_ASN1_BOOLEAN) {
107
- i = ASN1_R_EXPECTING_A_BOOLEAN;
108
- goto err;
102
+ if (inf & V_ASN1_CONSTRUCTED) {
103
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE);
104
+ return -1;
105
+ }
106
+
107
+ if (tag != V_ASN1_BOOLEAN || xclass != V_ASN1_UNIVERSAL) {
108
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPECTING_A_BOOLEAN);
109
+ return -1;
109
110
  }
110
111
 
111
112
  if (len != 1) {
112
- i = ASN1_R_BOOLEAN_IS_WRONG_LENGTH;
113
- goto err;
113
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH);
114
+ return -1;
114
115
  }
115
- ret = (int)*(p++);
116
- if (a != NULL)
116
+ ASN1_BOOLEAN ret = (ASN1_BOOLEAN)*(p++);
117
+ if (a != NULL) {
117
118
  (*a) = ret;
119
+ }
118
120
  *pp = p;
119
- return (ret);
120
- err:
121
- OPENSSL_PUT_ERROR(ASN1, i);
122
- return (ret);
121
+ return ret;
123
122
  }
@@ -56,18 +56,23 @@
56
56
 
57
57
  #include <openssl/asn1.h>
58
58
 
59
- #include <stdlib.h> /* For bsearch */
59
+ #include <assert.h>
60
+ #include <stdlib.h>
60
61
  #include <string.h>
61
62
 
62
63
  #include <openssl/err.h>
63
64
  #include <openssl/mem.h>
64
65
  #include <openssl/obj.h>
65
- #include <openssl/stack.h>
66
66
 
67
- DEFINE_STACK_OF(ASN1_STRING_TABLE)
67
+ #include "../internal.h"
68
+ #include "../lhash/internal.h"
69
+ #include "internal.h"
68
70
 
69
- static STACK_OF(ASN1_STRING_TABLE) *stable = NULL;
70
- static void st_free(ASN1_STRING_TABLE *tbl);
71
+
72
+ DEFINE_LHASH_OF(ASN1_STRING_TABLE)
73
+
74
+ static LHASH_OF(ASN1_STRING_TABLE) *string_tables = NULL;
75
+ static struct CRYPTO_STATIC_MUTEX string_tables_lock = CRYPTO_STATIC_MUTEX_INIT;
71
76
 
72
77
  void ASN1_STRING_set_default_mask(unsigned long mask)
73
78
  {
@@ -83,34 +88,36 @@ int ASN1_STRING_set_default_mask_asc(const char *p)
83
88
  return 1;
84
89
  }
85
90
 
91
+ static const ASN1_STRING_TABLE *asn1_string_table_get(int nid);
92
+
86
93
  /*
87
94
  * The following function generates an ASN1_STRING based on limits in a
88
95
  * table. Frequently the types and length of an ASN1_STRING are restricted by
89
96
  * a corresponding OID. For example certificates and certificate requests.
90
97
  */
91
98
 
92
- ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out,
93
- const unsigned char *in, int inlen,
94
- int inform, int nid)
99
+ ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in,
100
+ int len, int inform, int nid)
95
101
  {
96
- ASN1_STRING_TABLE *tbl;
97
102
  ASN1_STRING *str = NULL;
98
- unsigned long mask;
99
103
  int ret;
100
- if (!out)
104
+ if (!out) {
101
105
  out = &str;
102
- tbl = ASN1_STRING_TABLE_get(nid);
103
- if (tbl) {
104
- mask = tbl->mask;
105
- if (!(tbl->flags & STABLE_NO_MASK))
106
+ }
107
+ const ASN1_STRING_TABLE *tbl = asn1_string_table_get(nid);
108
+ if (tbl != NULL) {
109
+ unsigned long mask = tbl->mask;
110
+ if (!(tbl->flags & STABLE_NO_MASK)) {
106
111
  mask &= B_ASN1_UTF8STRING;
107
- ret = ASN1_mbstring_ncopy(out, in, inlen, inform, mask,
108
- tbl->minsize, tbl->maxsize);
112
+ }
113
+ ret = ASN1_mbstring_ncopy(out, in, len, inform, mask, tbl->minsize,
114
+ tbl->maxsize);
109
115
  } else {
110
- ret = ASN1_mbstring_copy(out, in, inlen, inform, B_ASN1_UTF8STRING);
116
+ ret = ASN1_mbstring_copy(out, in, len, inform, B_ASN1_UTF8STRING);
111
117
  }
112
- if (ret <= 0)
118
+ if (ret <= 0) {
113
119
  return NULL;
120
+ }
114
121
  return *out;
115
122
  }
116
123
 
@@ -118,15 +125,13 @@ ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out,
118
125
  * Now the tables and helper functions for the string table:
119
126
  */
120
127
 
121
- /* size limits: this stuff is taken straight from RFC 3280 */
122
-
128
+ /* See RFC 5280. */
123
129
  #define ub_name 32768
124
130
  #define ub_common_name 64
125
131
  #define ub_locality_name 128
126
132
  #define ub_state_name 128
127
133
  #define ub_organization_name 64
128
134
  #define ub_organization_unit_name 64
129
- #define ub_title 64
130
135
  #define ub_email_address 128
131
136
  #define ub_serial_number 64
132
137
 
@@ -157,120 +162,105 @@ static const ASN1_STRING_TABLE tbl_standard[] = {
157
162
  {NID_ms_csp_name, -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK}
158
163
  };
159
164
 
160
- static int sk_table_cmp(const ASN1_STRING_TABLE **a,
161
- const ASN1_STRING_TABLE **b)
165
+ static int table_cmp(const ASN1_STRING_TABLE *a, const ASN1_STRING_TABLE *b)
162
166
  {
163
- return (*a)->nid - (*b)->nid;
167
+ if (a->nid < b->nid) {
168
+ return -1;
169
+ }
170
+ if (a->nid > b->nid) {
171
+ return 1;
172
+ }
173
+ return 0;
164
174
  }
165
175
 
166
- static int table_cmp(const void *in_a, const void *in_b)
176
+ static int table_cmp_void(const void *a, const void *b)
167
177
  {
168
- const ASN1_STRING_TABLE *a = in_a;
169
- const ASN1_STRING_TABLE *b = in_b;
170
- return a->nid - b->nid;
178
+ return table_cmp(a, b);
171
179
  }
172
180
 
173
- ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid)
181
+ static uint32_t table_hash(const ASN1_STRING_TABLE *tbl)
174
182
  {
175
- int found;
176
- size_t idx;
177
- ASN1_STRING_TABLE *ttmp;
178
- ASN1_STRING_TABLE fnd;
179
- fnd.nid = nid;
180
-
181
- ttmp =
182
- bsearch(&fnd, tbl_standard,
183
- sizeof(tbl_standard) / sizeof(ASN1_STRING_TABLE),
184
- sizeof(ASN1_STRING_TABLE), table_cmp);
185
- if (ttmp)
186
- return ttmp;
187
- if (!stable)
188
- return NULL;
189
- sk_ASN1_STRING_TABLE_sort(stable);
190
- found = sk_ASN1_STRING_TABLE_find(stable, &idx, &fnd);
191
- if (!found)
192
- return NULL;
193
- return sk_ASN1_STRING_TABLE_value(stable, idx);
183
+ return OPENSSL_hash32(&tbl->nid, sizeof(tbl->nid));
194
184
  }
195
185
 
196
- int ASN1_STRING_TABLE_add(int nid,
197
- long minsize, long maxsize, unsigned long mask,
198
- unsigned long flags)
186
+ static const ASN1_STRING_TABLE *asn1_string_table_get(int nid)
199
187
  {
200
- ASN1_STRING_TABLE *tmp;
201
- char new_nid = 0;
202
- flags &= ~STABLE_FLAGS_MALLOC;
203
- if (!stable)
204
- stable = sk_ASN1_STRING_TABLE_new(sk_table_cmp);
205
- if (!stable) {
206
- OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
207
- return 0;
188
+ ASN1_STRING_TABLE key;
189
+ key.nid = nid;
190
+ const ASN1_STRING_TABLE *tbl =
191
+ bsearch(&key, tbl_standard, OPENSSL_ARRAY_SIZE(tbl_standard),
192
+ sizeof(ASN1_STRING_TABLE), table_cmp_void);
193
+ if (tbl != NULL) {
194
+ return tbl;
208
195
  }
209
- if (!(tmp = ASN1_STRING_TABLE_get(nid))) {
210
- tmp = OPENSSL_malloc(sizeof(ASN1_STRING_TABLE));
211
- if (!tmp) {
212
- OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
213
- return 0;
214
- }
215
- tmp->flags = flags | STABLE_FLAGS_MALLOC;
216
- tmp->nid = nid;
217
- tmp->minsize = tmp->maxsize = -1;
218
- new_nid = 1;
219
- } else
220
- tmp->flags = (tmp->flags & STABLE_FLAGS_MALLOC) | flags;
221
- if (minsize != -1)
222
- tmp->minsize = minsize;
223
- if (maxsize != -1)
224
- tmp->maxsize = maxsize;
225
- tmp->mask = mask;
226
- if (new_nid)
227
- sk_ASN1_STRING_TABLE_push(stable, tmp);
228
- return 1;
229
- }
230
196
 
231
- void ASN1_STRING_TABLE_cleanup(void)
232
- {
233
- STACK_OF(ASN1_STRING_TABLE) *tmp;
234
- tmp = stable;
235
- if (!tmp)
236
- return;
237
- stable = NULL;
238
- sk_ASN1_STRING_TABLE_pop_free(tmp, st_free);
197
+ CRYPTO_STATIC_MUTEX_lock_read(&string_tables_lock);
198
+ if (string_tables != NULL) {
199
+ tbl = lh_ASN1_STRING_TABLE_retrieve(string_tables, &key);
200
+ }
201
+ CRYPTO_STATIC_MUTEX_unlock_read(&string_tables_lock);
202
+ /* Note returning |tbl| without the lock is only safe because
203
+ * |ASN1_STRING_TABLE_add| cannot modify or delete existing entries. If we
204
+ * wish to support that, this function must copy the result under a lock. */
205
+ return tbl;
239
206
  }
240
207
 
241
- static void st_free(ASN1_STRING_TABLE *tbl)
208
+ int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize,
209
+ unsigned long mask, unsigned long flags)
242
210
  {
243
- if (tbl->flags & STABLE_FLAGS_MALLOC)
244
- OPENSSL_free(tbl);
245
- }
246
-
247
- #ifdef STRING_TABLE_TEST
211
+ /* Existing entries cannot be overwritten. */
212
+ if (asn1_string_table_get(nid) != NULL) {
213
+ OPENSSL_PUT_ERROR(ASN1, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
214
+ return 0;
215
+ }
248
216
 
249
- int main(void)
250
- {
251
- ASN1_STRING_TABLE *tmp;
252
- int i, last_nid = -1;
217
+ int ret = 0;
218
+ CRYPTO_STATIC_MUTEX_lock_write(&string_tables_lock);
253
219
 
254
- for (tmp = tbl_standard, i = 0;
255
- i < sizeof(tbl_standard) / sizeof(ASN1_STRING_TABLE); i++, tmp++) {
256
- if (tmp->nid < last_nid) {
257
- last_nid = 0;
258
- break;
220
+ if (string_tables == NULL) {
221
+ string_tables = lh_ASN1_STRING_TABLE_new(table_hash, table_cmp);
222
+ if (string_tables == NULL) {
223
+ goto err;
224
+ }
225
+ } else {
226
+ /* Check again for an existing entry. One may have been added while
227
+ * unlocked. */
228
+ ASN1_STRING_TABLE key;
229
+ key.nid = nid;
230
+ if (lh_ASN1_STRING_TABLE_retrieve(string_tables, &key) != NULL) {
231
+ OPENSSL_PUT_ERROR(ASN1, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
232
+ goto err;
259
233
  }
260
- last_nid = tmp->nid;
261
234
  }
262
235
 
263
- if (last_nid != 0) {
264
- printf("Table order OK\n");
265
- exit(0);
236
+ ASN1_STRING_TABLE *tbl = OPENSSL_malloc(sizeof(ASN1_STRING_TABLE));
237
+ if (tbl == NULL) {
238
+ goto err;
239
+ }
240
+ tbl->nid = nid;
241
+ tbl->flags = flags;
242
+ tbl->minsize = minsize;
243
+ tbl->maxsize = maxsize;
244
+ tbl->mask = mask;
245
+ ASN1_STRING_TABLE *old_tbl;
246
+ if (!lh_ASN1_STRING_TABLE_insert(string_tables, &old_tbl, tbl)) {
247
+ OPENSSL_free(tbl);
248
+ goto err;
266
249
  }
250
+ assert(old_tbl == NULL);
251
+ ret = 1;
267
252
 
268
- for (tmp = tbl_standard, i = 0;
269
- i < sizeof(tbl_standard) / sizeof(ASN1_STRING_TABLE); i++, tmp++)
270
- printf("Index %d, NID %d, Name=%s\n", i, tmp->nid,
271
- OBJ_nid2ln(tmp->nid));
253
+ err:
254
+ CRYPTO_STATIC_MUTEX_unlock_write(&string_tables_lock);
255
+ return ret;
256
+ }
272
257
 
273
- return 0;
258
+ void ASN1_STRING_TABLE_cleanup(void)
259
+ {
274
260
  }
275
261
 
276
- #endif
262
+ void asn1_get_string_table_for_testing(const ASN1_STRING_TABLE **out_ptr,
263
+ size_t *out_len) {
264
+ *out_ptr = tbl_standard;
265
+ *out_len = OPENSSL_ARRAY_SIZE(tbl_standard);
266
+ }
@@ -175,6 +175,19 @@ const void *asn1_type_value_as_pointer(const ASN1_TYPE *a);
175
175
  * ASN.1 PrintableString, and zero otherwise. */
176
176
  int asn1_is_printable(uint32_t value);
177
177
 
178
+ typedef struct {
179
+ int nid;
180
+ long minsize;
181
+ long maxsize;
182
+ unsigned long mask;
183
+ unsigned long flags;
184
+ } ASN1_STRING_TABLE;
185
+
186
+ /* asn1_get_string_table_for_testing sets |*out_ptr| and |*out_len| to the table
187
+ * of built-in |ASN1_STRING_TABLE| values. It is exported for testing. */
188
+ OPENSSL_EXPORT void asn1_get_string_table_for_testing(
189
+ const ASN1_STRING_TABLE **out_ptr, size_t *out_len);
190
+
178
191
 
179
192
  #if defined(__cplusplus)
180
193
  } /* extern C */
@@ -42,19 +42,17 @@ static const uint8_t kSigma[10 * 16] = {
42
42
  // clang-format on
43
43
  };
44
44
 
45
- #define RIGHT_ROTATE(v, n) (((v) >> (n)) | ((v) << (64 - (n))))
46
-
47
45
  // https://tools.ietf.org/html/rfc7693#section-3.1
48
46
  static void blake2b_mix(uint64_t v[16], int a, int b, int c, int d, uint64_t x,
49
47
  uint64_t y) {
50
48
  v[a] = v[a] + v[b] + x;
51
- v[d] = RIGHT_ROTATE(v[d] ^ v[a], 32);
49
+ v[d] = CRYPTO_rotr_u64(v[d] ^ v[a], 32);
52
50
  v[c] = v[c] + v[d];
53
- v[b] = RIGHT_ROTATE(v[b] ^ v[c], 24);
51
+ v[b] = CRYPTO_rotr_u64(v[b] ^ v[c], 24);
54
52
  v[a] = v[a] + v[b] + y;
55
- v[d] = RIGHT_ROTATE(v[d] ^ v[a], 16);
53
+ v[d] = CRYPTO_rotr_u64(v[d] ^ v[a], 16);
56
54
  v[c] = v[c] + v[d];
57
- v[b] = RIGHT_ROTATE(v[b] ^ v[c], 63);
55
+ v[b] = CRYPTO_rotr_u64(v[b] ^ v[c], 63);
58
56
  }
59
57
 
60
58
  static void blake2b_transform(
@@ -25,22 +25,20 @@
25
25
  #include "internal.h"
26
26
 
27
27
 
28
- #define U8TO32_LITTLE(p) \
29
- (((uint32_t)((p)[0])) | ((uint32_t)((p)[1]) << 8) | \
30
- ((uint32_t)((p)[2]) << 16) | ((uint32_t)((p)[3]) << 24))
31
-
32
28
  // sigma contains the ChaCha constants, which happen to be an ASCII string.
33
29
  static const uint8_t sigma[16] = { 'e', 'x', 'p', 'a', 'n', 'd', ' ', '3',
34
30
  '2', '-', 'b', 'y', 't', 'e', ' ', 'k' };
35
31
 
36
- #define ROTATE(v, n) (((v) << (n)) | ((v) >> (32 - (n))))
37
-
38
32
  // QUARTERROUND updates a, b, c, d with a ChaCha "quarter" round.
39
- #define QUARTERROUND(a, b, c, d) \
40
- x[a] += x[b]; x[d] = ROTATE(x[d] ^ x[a], 16); \
41
- x[c] += x[d]; x[b] = ROTATE(x[b] ^ x[c], 12); \
42
- x[a] += x[b]; x[d] = ROTATE(x[d] ^ x[a], 8); \
43
- x[c] += x[d]; x[b] = ROTATE(x[b] ^ x[c], 7);
33
+ #define QUARTERROUND(a, b, c, d) \
34
+ x[a] += x[b]; \
35
+ x[d] = CRYPTO_rotl_u32(x[d] ^ x[a], 16); \
36
+ x[c] += x[d]; \
37
+ x[b] = CRYPTO_rotl_u32(x[b] ^ x[c], 12); \
38
+ x[a] += x[b]; \
39
+ x[d] = CRYPTO_rotl_u32(x[d] ^ x[a], 8); \
40
+ x[c] += x[d]; \
41
+ x[b] = CRYPTO_rotl_u32(x[b] ^ x[c], 7);
44
42
 
45
43
  void CRYPTO_hchacha20(uint8_t out[32], const uint8_t key[32],
46
44
  const uint8_t nonce[16]) {
@@ -71,24 +69,25 @@ void CRYPTO_chacha_20(uint8_t *out, const uint8_t *in, size_t in_len,
71
69
  uint32_t counter) {
72
70
  assert(!buffers_alias(out, in_len, in, in_len) || in == out);
73
71
 
74
- uint32_t counter_nonce[4]; counter_nonce[0] = counter;
75
- counter_nonce[1] = U8TO32_LITTLE(nonce + 0);
76
- counter_nonce[2] = U8TO32_LITTLE(nonce + 4);
77
- counter_nonce[3] = U8TO32_LITTLE(nonce + 8);
72
+ uint32_t counter_nonce[4];
73
+ counter_nonce[0] = counter;
74
+ counter_nonce[1] = CRYPTO_load_u32_le(nonce + 0);
75
+ counter_nonce[2] = CRYPTO_load_u32_le(nonce + 4);
76
+ counter_nonce[3] = CRYPTO_load_u32_le(nonce + 8);
78
77
 
79
78
  const uint32_t *key_ptr = (const uint32_t *)key;
80
79
  #if !defined(OPENSSL_X86) && !defined(OPENSSL_X86_64)
81
80
  // The assembly expects the key to be four-byte aligned.
82
81
  uint32_t key_u32[8];
83
82
  if ((((uintptr_t)key) & 3) != 0) {
84
- key_u32[0] = U8TO32_LITTLE(key + 0);
85
- key_u32[1] = U8TO32_LITTLE(key + 4);
86
- key_u32[2] = U8TO32_LITTLE(key + 8);
87
- key_u32[3] = U8TO32_LITTLE(key + 12);
88
- key_u32[4] = U8TO32_LITTLE(key + 16);
89
- key_u32[5] = U8TO32_LITTLE(key + 20);
90
- key_u32[6] = U8TO32_LITTLE(key + 24);
91
- key_u32[7] = U8TO32_LITTLE(key + 28);
83
+ key_u32[0] = CRYPTO_load_u32_le(key + 0);
84
+ key_u32[1] = CRYPTO_load_u32_le(key + 4);
85
+ key_u32[2] = CRYPTO_load_u32_le(key + 8);
86
+ key_u32[3] = CRYPTO_load_u32_le(key + 12);
87
+ key_u32[4] = CRYPTO_load_u32_le(key + 16);
88
+ key_u32[5] = CRYPTO_load_u32_le(key + 20);
89
+ key_u32[6] = CRYPTO_load_u32_le(key + 24);
90
+ key_u32[7] = CRYPTO_load_u32_le(key + 28);
92
91
 
93
92
  key_ptr = key_u32;
94
93
  }
@@ -99,14 +98,6 @@ void CRYPTO_chacha_20(uint8_t *out, const uint8_t *in, size_t in_len,
99
98
 
100
99
  #else
101
100
 
102
- #define U32TO8_LITTLE(p, v) \
103
- { \
104
- (p)[0] = (v >> 0) & 0xff; \
105
- (p)[1] = (v >> 8) & 0xff; \
106
- (p)[2] = (v >> 16) & 0xff; \
107
- (p)[3] = (v >> 24) & 0xff; \
108
- }
109
-
110
101
  // chacha_core performs 20 rounds of ChaCha on the input words in
111
102
  // |input| and writes the 64 output bytes to |output|.
112
103
  static void chacha_core(uint8_t output[64], const uint32_t input[16]) {
@@ -129,7 +120,7 @@ static void chacha_core(uint8_t output[64], const uint32_t input[16]) {
129
120
  x[i] += input[i];
130
121
  }
131
122
  for (i = 0; i < 16; ++i) {
132
- U32TO8_LITTLE(output + 4 * i, x[i]);
123
+ CRYPTO_store_u32_le(output + 4 * i, x[i]);
133
124
  }
134
125
  }
135
126
 
@@ -142,25 +133,25 @@ void CRYPTO_chacha_20(uint8_t *out, const uint8_t *in, size_t in_len,
142
133
  uint8_t buf[64];
143
134
  size_t todo, i;
144
135
 
145
- input[0] = U8TO32_LITTLE(sigma + 0);
146
- input[1] = U8TO32_LITTLE(sigma + 4);
147
- input[2] = U8TO32_LITTLE(sigma + 8);
148
- input[3] = U8TO32_LITTLE(sigma + 12);
136
+ input[0] = CRYPTO_load_u32_le(sigma + 0);
137
+ input[1] = CRYPTO_load_u32_le(sigma + 4);
138
+ input[2] = CRYPTO_load_u32_le(sigma + 8);
139
+ input[3] = CRYPTO_load_u32_le(sigma + 12);
149
140
 
150
- input[4] = U8TO32_LITTLE(key + 0);
151
- input[5] = U8TO32_LITTLE(key + 4);
152
- input[6] = U8TO32_LITTLE(key + 8);
153
- input[7] = U8TO32_LITTLE(key + 12);
141
+ input[4] = CRYPTO_load_u32_le(key + 0);
142
+ input[5] = CRYPTO_load_u32_le(key + 4);
143
+ input[6] = CRYPTO_load_u32_le(key + 8);
144
+ input[7] = CRYPTO_load_u32_le(key + 12);
154
145
 
155
- input[8] = U8TO32_LITTLE(key + 16);
156
- input[9] = U8TO32_LITTLE(key + 20);
157
- input[10] = U8TO32_LITTLE(key + 24);
158
- input[11] = U8TO32_LITTLE(key + 28);
146
+ input[8] = CRYPTO_load_u32_le(key + 16);
147
+ input[9] = CRYPTO_load_u32_le(key + 20);
148
+ input[10] = CRYPTO_load_u32_le(key + 24);
149
+ input[11] = CRYPTO_load_u32_le(key + 28);
159
150
 
160
151
  input[12] = counter;
161
- input[13] = U8TO32_LITTLE(nonce + 0);
162
- input[14] = U8TO32_LITTLE(nonce + 4);
163
- input[15] = U8TO32_LITTLE(nonce + 8);
152
+ input[13] = CRYPTO_load_u32_le(nonce + 0);
153
+ input[14] = CRYPTO_load_u32_le(nonce + 4);
154
+ input[15] = CRYPTO_load_u32_le(nonce + 8);
164
155
 
165
156
  while (in_len > 0) {
166
157
  todo = sizeof(buf);