grpc 1.43.1 → 1.44.0.pre2

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 (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. data/src/core/lib/transport/status_metadata.h +0 -48
@@ -0,0 +1,171 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef ABSL_RANDOM_INTERNAL_PLATFORM_H_
16
+ #define ABSL_RANDOM_INTERNAL_PLATFORM_H_
17
+
18
+ // HERMETIC NOTE: The randen_hwaes target must not introduce duplicate
19
+ // symbols from arbitrary system and other headers, since it may be built
20
+ // with different flags from other targets, using different levels of
21
+ // optimization, potentially introducing ODR violations.
22
+
23
+ // -----------------------------------------------------------------------------
24
+ // Platform Feature Checks
25
+ // -----------------------------------------------------------------------------
26
+
27
+ // Currently supported operating systems and associated preprocessor
28
+ // symbols:
29
+ //
30
+ // Linux and Linux-derived __linux__
31
+ // Android __ANDROID__ (implies __linux__)
32
+ // Linux (non-Android) __linux__ && !__ANDROID__
33
+ // Darwin (macOS and iOS) __APPLE__
34
+ // Akaros (http://akaros.org) __ros__
35
+ // Windows _WIN32
36
+ // NaCL __native_client__
37
+ // AsmJS __asmjs__
38
+ // WebAssembly __wasm__
39
+ // Fuchsia __Fuchsia__
40
+ //
41
+ // Note that since Android defines both __ANDROID__ and __linux__, one
42
+ // may probe for either Linux or Android by simply testing for __linux__.
43
+ //
44
+ // NOTE: For __APPLE__ platforms, we use #include <TargetConditionals.h>
45
+ // to distinguish os variants.
46
+ //
47
+ // http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system
48
+
49
+ #if defined(__APPLE__)
50
+ #include <TargetConditionals.h>
51
+ #endif
52
+
53
+ // -----------------------------------------------------------------------------
54
+ // Architecture Checks
55
+ // -----------------------------------------------------------------------------
56
+
57
+ // These preprocessor directives are trying to determine CPU architecture,
58
+ // including necessary headers to support hardware AES.
59
+ //
60
+ // ABSL_ARCH_{X86/PPC/ARM} macros determine the platform.
61
+ #if defined(__x86_64__) || defined(__x86_64) || defined(_M_AMD64) || \
62
+ defined(_M_X64)
63
+ #define ABSL_ARCH_X86_64
64
+ #elif defined(__i386) || defined(_M_IX86)
65
+ #define ABSL_ARCH_X86_32
66
+ #elif defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64)
67
+ #define ABSL_ARCH_AARCH64
68
+ #elif defined(__arm__) || defined(__ARMEL__) || defined(_M_ARM)
69
+ #define ABSL_ARCH_ARM
70
+ #elif defined(__powerpc64__) || defined(__PPC64__) || defined(__powerpc__) || \
71
+ defined(__ppc__) || defined(__PPC__)
72
+ #define ABSL_ARCH_PPC
73
+ #else
74
+ // Unsupported architecture.
75
+ // * https://sourceforge.net/p/predef/wiki/Architectures/
76
+ // * https://msdn.microsoft.com/en-us/library/b0084kay.aspx
77
+ // * for gcc, clang: "echo | gcc -E -dM -"
78
+ #endif
79
+
80
+ // -----------------------------------------------------------------------------
81
+ // Attribute Checks
82
+ // -----------------------------------------------------------------------------
83
+
84
+ // ABSL_RANDOM_INTERNAL_RESTRICT annotates whether pointers may be considered
85
+ // to be unaliased.
86
+ #if defined(__clang__) || defined(__GNUC__)
87
+ #define ABSL_RANDOM_INTERNAL_RESTRICT __restrict__
88
+ #elif defined(_MSC_VER)
89
+ #define ABSL_RANDOM_INTERNAL_RESTRICT __restrict
90
+ #else
91
+ #define ABSL_RANDOM_INTERNAL_RESTRICT
92
+ #endif
93
+
94
+ // ABSL_HAVE_ACCELERATED_AES indicates whether the currently active compiler
95
+ // flags (e.g. -maes) allow using hardware accelerated AES instructions, which
96
+ // implies us assuming that the target platform supports them.
97
+ #define ABSL_HAVE_ACCELERATED_AES 0
98
+
99
+ #if defined(ABSL_ARCH_X86_64)
100
+
101
+ #if defined(__AES__) || defined(__AVX__)
102
+ #undef ABSL_HAVE_ACCELERATED_AES
103
+ #define ABSL_HAVE_ACCELERATED_AES 1
104
+ #endif
105
+
106
+ #elif defined(ABSL_ARCH_PPC)
107
+
108
+ // Rely on VSX and CRYPTO extensions for vcipher on PowerPC.
109
+ #if (defined(__VEC__) || defined(__ALTIVEC__)) && defined(__VSX__) && \
110
+ defined(__CRYPTO__)
111
+ #undef ABSL_HAVE_ACCELERATED_AES
112
+ #define ABSL_HAVE_ACCELERATED_AES 1
113
+ #endif
114
+
115
+ #elif defined(ABSL_ARCH_ARM) || defined(ABSL_ARCH_AARCH64)
116
+
117
+ // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0053c/IHI0053C_acle_2_0.pdf
118
+ // Rely on NEON+CRYPTO extensions for ARM.
119
+ #if defined(__ARM_NEON) && defined(__ARM_FEATURE_CRYPTO)
120
+ #undef ABSL_HAVE_ACCELERATED_AES
121
+ #define ABSL_HAVE_ACCELERATED_AES 1
122
+ #endif
123
+
124
+ #endif
125
+
126
+ // NaCl does not allow AES.
127
+ #if defined(__native_client__)
128
+ #undef ABSL_HAVE_ACCELERATED_AES
129
+ #define ABSL_HAVE_ACCELERATED_AES 0
130
+ #endif
131
+
132
+ // ABSL_RANDOM_INTERNAL_AES_DISPATCH indicates whether the currently active
133
+ // platform has, or should use run-time dispatch for selecting the
134
+ // acclerated Randen implementation.
135
+ #define ABSL_RANDOM_INTERNAL_AES_DISPATCH 0
136
+
137
+ #if defined(ABSL_ARCH_X86_64)
138
+ // Dispatch is available on x86_64
139
+ #undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
140
+ #define ABSL_RANDOM_INTERNAL_AES_DISPATCH 1
141
+ #elif defined(__linux__) && defined(ABSL_ARCH_PPC)
142
+ // Or when running linux PPC
143
+ #undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
144
+ #define ABSL_RANDOM_INTERNAL_AES_DISPATCH 1
145
+ #elif defined(__linux__) && defined(ABSL_ARCH_AARCH64)
146
+ // Or when running linux AArch64
147
+ #undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
148
+ #define ABSL_RANDOM_INTERNAL_AES_DISPATCH 1
149
+ #elif defined(__linux__) && defined(ABSL_ARCH_ARM) && (__ARM_ARCH >= 8)
150
+ // Or when running linux ARM v8 or higher.
151
+ // (This captures a lot of Android configurations.)
152
+ #undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
153
+ #define ABSL_RANDOM_INTERNAL_AES_DISPATCH 1
154
+ #endif
155
+
156
+ // NaCl does not allow dispatch.
157
+ #if defined(__native_client__)
158
+ #undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
159
+ #define ABSL_RANDOM_INTERNAL_AES_DISPATCH 0
160
+ #endif
161
+
162
+ // iOS does not support dispatch, even on x86, since applications
163
+ // should be bundled as fat binaries, with a different build tailored for
164
+ // each specific supported platform/architecture.
165
+ #if (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || \
166
+ (defined(TARGET_OS_IPHONE_SIMULATOR) && TARGET_OS_IPHONE_SIMULATOR)
167
+ #undef ABSL_RANDOM_INTERNAL_AES_DISPATCH
168
+ #define ABSL_RANDOM_INTERNAL_AES_DISPATCH 0
169
+ #endif
170
+
171
+ #endif // ABSL_RANDOM_INTERNAL_PLATFORM_H_
@@ -0,0 +1,253 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/random/internal/pool_urbg.h"
16
+
17
+ #include <algorithm>
18
+ #include <atomic>
19
+ #include <cstdint>
20
+ #include <cstring>
21
+ #include <iterator>
22
+
23
+ #include "absl/base/attributes.h"
24
+ #include "absl/base/call_once.h"
25
+ #include "absl/base/config.h"
26
+ #include "absl/base/internal/endian.h"
27
+ #include "absl/base/internal/raw_logging.h"
28
+ #include "absl/base/internal/spinlock.h"
29
+ #include "absl/base/internal/sysinfo.h"
30
+ #include "absl/base/internal/unaligned_access.h"
31
+ #include "absl/base/optimization.h"
32
+ #include "absl/random/internal/randen.h"
33
+ #include "absl/random/internal/seed_material.h"
34
+ #include "absl/random/seed_gen_exception.h"
35
+
36
+ using absl::base_internal::SpinLock;
37
+ using absl::base_internal::SpinLockHolder;
38
+
39
+ namespace absl {
40
+ ABSL_NAMESPACE_BEGIN
41
+ namespace random_internal {
42
+ namespace {
43
+
44
+ // RandenPoolEntry is a thread-safe pseudorandom bit generator, implementing a
45
+ // single generator within a RandenPool<T>. It is an internal implementation
46
+ // detail, and does not aim to conform to [rand.req.urng].
47
+ //
48
+ // NOTE: There are alignment issues when used on ARM, for instance.
49
+ // See the allocation code in PoolAlignedAlloc().
50
+ class RandenPoolEntry {
51
+ public:
52
+ static constexpr size_t kState = RandenTraits::kStateBytes / sizeof(uint32_t);
53
+ static constexpr size_t kCapacity =
54
+ RandenTraits::kCapacityBytes / sizeof(uint32_t);
55
+
56
+ void Init(absl::Span<const uint32_t> data) {
57
+ SpinLockHolder l(&mu_); // Always uncontested.
58
+ std::copy(data.begin(), data.end(), std::begin(state_));
59
+ next_ = kState;
60
+ }
61
+
62
+ // Copy bytes into out.
63
+ void Fill(uint8_t* out, size_t bytes) ABSL_LOCKS_EXCLUDED(mu_);
64
+
65
+ // Returns random bits from the buffer in units of T.
66
+ template <typename T>
67
+ inline T Generate() ABSL_LOCKS_EXCLUDED(mu_);
68
+
69
+ inline void MaybeRefill() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
70
+ if (next_ >= kState) {
71
+ next_ = kCapacity;
72
+ impl_.Generate(state_);
73
+ }
74
+ }
75
+
76
+ private:
77
+ // Randen URBG state.
78
+ uint32_t state_[kState] ABSL_GUARDED_BY(mu_); // First to satisfy alignment.
79
+ SpinLock mu_;
80
+ const Randen impl_;
81
+ size_t next_ ABSL_GUARDED_BY(mu_);
82
+ };
83
+
84
+ template <>
85
+ inline uint8_t RandenPoolEntry::Generate<uint8_t>() {
86
+ SpinLockHolder l(&mu_);
87
+ MaybeRefill();
88
+ return static_cast<uint8_t>(state_[next_++]);
89
+ }
90
+
91
+ template <>
92
+ inline uint16_t RandenPoolEntry::Generate<uint16_t>() {
93
+ SpinLockHolder l(&mu_);
94
+ MaybeRefill();
95
+ return static_cast<uint16_t>(state_[next_++]);
96
+ }
97
+
98
+ template <>
99
+ inline uint32_t RandenPoolEntry::Generate<uint32_t>() {
100
+ SpinLockHolder l(&mu_);
101
+ MaybeRefill();
102
+ return state_[next_++];
103
+ }
104
+
105
+ template <>
106
+ inline uint64_t RandenPoolEntry::Generate<uint64_t>() {
107
+ SpinLockHolder l(&mu_);
108
+ if (next_ >= kState - 1) {
109
+ next_ = kCapacity;
110
+ impl_.Generate(state_);
111
+ }
112
+ auto p = state_ + next_;
113
+ next_ += 2;
114
+
115
+ uint64_t result;
116
+ std::memcpy(&result, p, sizeof(result));
117
+ return result;
118
+ }
119
+
120
+ void RandenPoolEntry::Fill(uint8_t* out, size_t bytes) {
121
+ SpinLockHolder l(&mu_);
122
+ while (bytes > 0) {
123
+ MaybeRefill();
124
+ size_t remaining = (kState - next_) * sizeof(state_[0]);
125
+ size_t to_copy = std::min(bytes, remaining);
126
+ std::memcpy(out, &state_[next_], to_copy);
127
+ out += to_copy;
128
+ bytes -= to_copy;
129
+ next_ += (to_copy + sizeof(state_[0]) - 1) / sizeof(state_[0]);
130
+ }
131
+ }
132
+
133
+ // Number of pooled urbg entries.
134
+ static constexpr int kPoolSize = 8;
135
+
136
+ // Shared pool entries.
137
+ static absl::once_flag pool_once;
138
+ ABSL_CACHELINE_ALIGNED static RandenPoolEntry* shared_pools[kPoolSize];
139
+
140
+ // Returns an id in the range [0 ... kPoolSize), which indexes into the
141
+ // pool of random engines.
142
+ //
143
+ // Each thread to access the pool is assigned a sequential ID (without reuse)
144
+ // from the pool-id space; the id is cached in a thread_local variable.
145
+ // This id is assigned based on the arrival-order of the thread to the
146
+ // GetPoolID call; this has no binary, CL, or runtime stability because
147
+ // on subsequent runs the order within the same program may be significantly
148
+ // different. However, as other thread IDs are not assigned sequentially,
149
+ // this is not expected to matter.
150
+ int GetPoolID() {
151
+ static_assert(kPoolSize >= 1,
152
+ "At least one urbg instance is required for PoolURBG");
153
+
154
+ ABSL_CONST_INIT static std::atomic<int64_t> sequence{0};
155
+
156
+ #ifdef ABSL_HAVE_THREAD_LOCAL
157
+ static thread_local int my_pool_id = -1;
158
+ if (ABSL_PREDICT_FALSE(my_pool_id < 0)) {
159
+ my_pool_id = (sequence++ % kPoolSize);
160
+ }
161
+ return my_pool_id;
162
+ #else
163
+ static pthread_key_t tid_key = [] {
164
+ pthread_key_t tmp_key;
165
+ int err = pthread_key_create(&tmp_key, nullptr);
166
+ if (err) {
167
+ ABSL_RAW_LOG(FATAL, "pthread_key_create failed with %d", err);
168
+ }
169
+ return tmp_key;
170
+ }();
171
+
172
+ // Store the value in the pthread_{get/set}specific. However an uninitialized
173
+ // value is 0, so add +1 to distinguish from the null value.
174
+ intptr_t my_pool_id =
175
+ reinterpret_cast<intptr_t>(pthread_getspecific(tid_key));
176
+ if (ABSL_PREDICT_FALSE(my_pool_id == 0)) {
177
+ // No allocated ID, allocate the next value, cache it, and return.
178
+ my_pool_id = (sequence++ % kPoolSize) + 1;
179
+ int err = pthread_setspecific(tid_key, reinterpret_cast<void*>(my_pool_id));
180
+ if (err) {
181
+ ABSL_RAW_LOG(FATAL, "pthread_setspecific failed with %d", err);
182
+ }
183
+ }
184
+ return my_pool_id - 1;
185
+ #endif
186
+ }
187
+
188
+ // Allocate a RandenPoolEntry with at least 32-byte alignment, which is required
189
+ // by ARM platform code.
190
+ RandenPoolEntry* PoolAlignedAlloc() {
191
+ constexpr size_t kAlignment =
192
+ ABSL_CACHELINE_SIZE > 32 ? ABSL_CACHELINE_SIZE : 32;
193
+
194
+ // Not all the platforms that we build for have std::aligned_alloc, however
195
+ // since we never free these objects, we can over allocate and munge the
196
+ // pointers to the correct alignment.
197
+ intptr_t x = reinterpret_cast<intptr_t>(
198
+ new char[sizeof(RandenPoolEntry) + kAlignment]);
199
+ auto y = x % kAlignment;
200
+ void* aligned = reinterpret_cast<void*>(y == 0 ? x : (x + kAlignment - y));
201
+ return new (aligned) RandenPoolEntry();
202
+ }
203
+
204
+ // Allocate and initialize kPoolSize objects of type RandenPoolEntry.
205
+ //
206
+ // The initialization strategy is to initialize one object directly from
207
+ // OS entropy, then to use that object to seed all of the individual
208
+ // pool instances.
209
+ void InitPoolURBG() {
210
+ static constexpr size_t kSeedSize =
211
+ RandenTraits::kStateBytes / sizeof(uint32_t);
212
+ // Read the seed data from OS entropy once.
213
+ uint32_t seed_material[kPoolSize * kSeedSize];
214
+ if (!random_internal::ReadSeedMaterialFromOSEntropy(
215
+ absl::MakeSpan(seed_material))) {
216
+ random_internal::ThrowSeedGenException();
217
+ }
218
+ for (int i = 0; i < kPoolSize; i++) {
219
+ shared_pools[i] = PoolAlignedAlloc();
220
+ shared_pools[i]->Init(
221
+ absl::MakeSpan(&seed_material[i * kSeedSize], kSeedSize));
222
+ }
223
+ }
224
+
225
+ // Returns the pool entry for the current thread.
226
+ RandenPoolEntry* GetPoolForCurrentThread() {
227
+ absl::call_once(pool_once, InitPoolURBG);
228
+ return shared_pools[GetPoolID()];
229
+ }
230
+
231
+ } // namespace
232
+
233
+ template <typename T>
234
+ typename RandenPool<T>::result_type RandenPool<T>::Generate() {
235
+ auto* pool = GetPoolForCurrentThread();
236
+ return pool->Generate<T>();
237
+ }
238
+
239
+ template <typename T>
240
+ void RandenPool<T>::Fill(absl::Span<result_type> data) {
241
+ auto* pool = GetPoolForCurrentThread();
242
+ pool->Fill(reinterpret_cast<uint8_t*>(data.data()),
243
+ data.size() * sizeof(result_type));
244
+ }
245
+
246
+ template class RandenPool<uint8_t>;
247
+ template class RandenPool<uint16_t>;
248
+ template class RandenPool<uint32_t>;
249
+ template class RandenPool<uint64_t>;
250
+
251
+ } // namespace random_internal
252
+ ABSL_NAMESPACE_END
253
+ } // namespace absl
@@ -0,0 +1,131 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef ABSL_RANDOM_INTERNAL_POOL_URBG_H_
16
+ #define ABSL_RANDOM_INTERNAL_POOL_URBG_H_
17
+
18
+ #include <cinttypes>
19
+ #include <limits>
20
+
21
+ #include "absl/random/internal/traits.h"
22
+ #include "absl/types/span.h"
23
+
24
+ namespace absl {
25
+ ABSL_NAMESPACE_BEGIN
26
+ namespace random_internal {
27
+
28
+ // RandenPool is a thread-safe random number generator [random.req.urbg] that
29
+ // uses an underlying pool of Randen generators to generate values. Each thread
30
+ // has affinity to one instance of the underlying pool generators. Concurrent
31
+ // access is guarded by a spin-lock.
32
+ template <typename T>
33
+ class RandenPool {
34
+ public:
35
+ using result_type = T;
36
+ static_assert(std::is_unsigned<result_type>::value,
37
+ "RandenPool template argument must be a built-in unsigned "
38
+ "integer type");
39
+
40
+ static constexpr result_type(min)() {
41
+ return (std::numeric_limits<result_type>::min)();
42
+ }
43
+
44
+ static constexpr result_type(max)() {
45
+ return (std::numeric_limits<result_type>::max)();
46
+ }
47
+
48
+ RandenPool() {}
49
+
50
+ // Returns a single value.
51
+ inline result_type operator()() { return Generate(); }
52
+
53
+ // Fill data with random values.
54
+ static void Fill(absl::Span<result_type> data);
55
+
56
+ protected:
57
+ // Generate returns a single value.
58
+ static result_type Generate();
59
+ };
60
+
61
+ extern template class RandenPool<uint8_t>;
62
+ extern template class RandenPool<uint16_t>;
63
+ extern template class RandenPool<uint32_t>;
64
+ extern template class RandenPool<uint64_t>;
65
+
66
+ // PoolURBG uses an underlying pool of random generators to implement a
67
+ // thread-compatible [random.req.urbg] interface with an internal cache of
68
+ // values.
69
+ template <typename T, size_t kBufferSize>
70
+ class PoolURBG {
71
+ // Inheritance to access the protected static members of RandenPool.
72
+ using unsigned_type = typename make_unsigned_bits<T>::type;
73
+ using PoolType = RandenPool<unsigned_type>;
74
+ using SpanType = absl::Span<unsigned_type>;
75
+
76
+ static constexpr size_t kInitialBuffer = kBufferSize + 1;
77
+ static constexpr size_t kHalfBuffer = kBufferSize / 2;
78
+
79
+ public:
80
+ using result_type = T;
81
+
82
+ static_assert(std::is_unsigned<result_type>::value,
83
+ "PoolURBG must be parameterized by an unsigned integer type");
84
+
85
+ static_assert(kBufferSize > 1,
86
+ "PoolURBG must be parameterized by a buffer-size > 1");
87
+
88
+ static_assert(kBufferSize <= 256,
89
+ "PoolURBG must be parameterized by a buffer-size <= 256");
90
+
91
+ static constexpr result_type(min)() {
92
+ return (std::numeric_limits<result_type>::min)();
93
+ }
94
+
95
+ static constexpr result_type(max)() {
96
+ return (std::numeric_limits<result_type>::max)();
97
+ }
98
+
99
+ PoolURBG() : next_(kInitialBuffer) {}
100
+
101
+ // copy-constructor does not copy cache.
102
+ PoolURBG(const PoolURBG&) : next_(kInitialBuffer) {}
103
+ const PoolURBG& operator=(const PoolURBG&) {
104
+ next_ = kInitialBuffer;
105
+ return *this;
106
+ }
107
+
108
+ // move-constructor does move cache.
109
+ PoolURBG(PoolURBG&&) = default;
110
+ PoolURBG& operator=(PoolURBG&&) = default;
111
+
112
+ inline result_type operator()() {
113
+ if (next_ >= kBufferSize) {
114
+ next_ = (kBufferSize > 2 && next_ > kBufferSize) ? kHalfBuffer : 0;
115
+ PoolType::Fill(SpanType(reinterpret_cast<unsigned_type*>(state_ + next_),
116
+ kBufferSize - next_));
117
+ }
118
+ return state_[next_++];
119
+ }
120
+
121
+ private:
122
+ // Buffer size.
123
+ size_t next_; // index within state_
124
+ result_type state_[kBufferSize];
125
+ };
126
+
127
+ } // namespace random_internal
128
+ ABSL_NAMESPACE_END
129
+ } // namespace absl
130
+
131
+ #endif // ABSL_RANDOM_INTERNAL_POOL_URBG_H_
@@ -0,0 +1,91 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/random/internal/randen.h"
16
+
17
+ #include "absl/base/internal/raw_logging.h"
18
+ #include "absl/random/internal/randen_detect.h"
19
+
20
+ // RANDen = RANDom generator or beetroots in Swiss High German.
21
+ // 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
22
+ // generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
23
+ //
24
+ // High-level summary:
25
+ // 1) Reverie (see "A Robust and Sponge-Like PRNG with Improved Efficiency") is
26
+ // a sponge-like random generator that requires a cryptographic permutation.
27
+ // It improves upon "Provably Robust Sponge-Based PRNGs and KDFs" by
28
+ // achieving backtracking resistance with only one Permute() per buffer.
29
+ //
30
+ // 2) "Simpira v2: A Family of Efficient Permutations Using the AES Round
31
+ // Function" constructs up to 1024-bit permutations using an improved
32
+ // Generalized Feistel network with 2-round AES-128 functions. This Feistel
33
+ // block shuffle achieves diffusion faster and is less vulnerable to
34
+ // sliced-biclique attacks than the Type-2 cyclic shuffle.
35
+ //
36
+ // 3) "Improving the Generalized Feistel" and "New criterion for diffusion
37
+ // property" extends the same kind of improved Feistel block shuffle to 16
38
+ // branches, which enables a 2048-bit permutation.
39
+ //
40
+ // We combine these three ideas and also change Simpira's subround keys from
41
+ // structured/low-entropy counters to digits of Pi.
42
+
43
+ namespace absl {
44
+ ABSL_NAMESPACE_BEGIN
45
+ namespace random_internal {
46
+ namespace {
47
+
48
+ struct RandenState {
49
+ const void* keys;
50
+ bool has_crypto;
51
+ };
52
+
53
+ RandenState GetRandenState() {
54
+ static const RandenState state = []() {
55
+ RandenState tmp;
56
+ #if ABSL_RANDOM_INTERNAL_AES_DISPATCH
57
+ // HW AES Dispatch.
58
+ if (HasRandenHwAesImplementation() && CPUSupportsRandenHwAes()) {
59
+ tmp.has_crypto = true;
60
+ tmp.keys = RandenHwAes::GetKeys();
61
+ } else {
62
+ tmp.has_crypto = false;
63
+ tmp.keys = RandenSlow::GetKeys();
64
+ }
65
+ #elif ABSL_HAVE_ACCELERATED_AES
66
+ // HW AES is enabled.
67
+ tmp.has_crypto = true;
68
+ tmp.keys = RandenHwAes::GetKeys();
69
+ #else
70
+ // HW AES is disabled.
71
+ tmp.has_crypto = false;
72
+ tmp.keys = RandenSlow::GetKeys();
73
+ #endif
74
+ return tmp;
75
+ }();
76
+ return state;
77
+ }
78
+
79
+ } // namespace
80
+
81
+ Randen::Randen() {
82
+ auto tmp = GetRandenState();
83
+ keys_ = tmp.keys;
84
+ #if ABSL_RANDOM_INTERNAL_AES_DISPATCH
85
+ has_crypto_ = tmp.has_crypto;
86
+ #endif
87
+ }
88
+
89
+ } // namespace random_internal
90
+ ABSL_NAMESPACE_END
91
+ } // namespace absl