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,258 @@
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_POISSON_DISTRIBUTION_H_
16
+ #define ABSL_RANDOM_POISSON_DISTRIBUTION_H_
17
+
18
+ #include <cassert>
19
+ #include <cmath>
20
+ #include <istream>
21
+ #include <limits>
22
+ #include <ostream>
23
+ #include <type_traits>
24
+
25
+ #include "absl/random/internal/fast_uniform_bits.h"
26
+ #include "absl/random/internal/fastmath.h"
27
+ #include "absl/random/internal/generate_real.h"
28
+ #include "absl/random/internal/iostream_state_saver.h"
29
+
30
+ namespace absl {
31
+ ABSL_NAMESPACE_BEGIN
32
+
33
+ // absl::poisson_distribution:
34
+ // Generates discrete variates conforming to a Poisson distribution.
35
+ // p(n) = (mean^n / n!) exp(-mean)
36
+ //
37
+ // Depending on the parameter, the distribution selects one of the following
38
+ // algorithms:
39
+ // * The standard algorithm, attributed to Knuth, extended using a split method
40
+ // for larger values
41
+ // * The "Ratio of Uniforms as a convenient method for sampling from classical
42
+ // discrete distributions", Stadlober, 1989.
43
+ // http://www.sciencedirect.com/science/article/pii/0377042790903495
44
+ //
45
+ // NOTE: param_type.mean() is a double, which permits values larger than
46
+ // poisson_distribution<IntType>::max(), however this should be avoided and
47
+ // the distribution results are limited to the max() value.
48
+ //
49
+ // The goals of this implementation are to provide good performance while still
50
+ // beig thread-safe: This limits the implementation to not using lgamma provided
51
+ // by <math.h>.
52
+ //
53
+ template <typename IntType = int>
54
+ class poisson_distribution {
55
+ public:
56
+ using result_type = IntType;
57
+
58
+ class param_type {
59
+ public:
60
+ using distribution_type = poisson_distribution;
61
+ explicit param_type(double mean = 1.0);
62
+
63
+ double mean() const { return mean_; }
64
+
65
+ friend bool operator==(const param_type& a, const param_type& b) {
66
+ return a.mean_ == b.mean_;
67
+ }
68
+
69
+ friend bool operator!=(const param_type& a, const param_type& b) {
70
+ return !(a == b);
71
+ }
72
+
73
+ private:
74
+ friend class poisson_distribution;
75
+
76
+ double mean_;
77
+ double emu_; // e ^ -mean_
78
+ double lmu_; // ln(mean_)
79
+ double s_;
80
+ double log_k_;
81
+ int split_;
82
+
83
+ static_assert(std::is_integral<IntType>::value,
84
+ "Class-template absl::poisson_distribution<> must be "
85
+ "parameterized using an integral type.");
86
+ };
87
+
88
+ poisson_distribution() : poisson_distribution(1.0) {}
89
+
90
+ explicit poisson_distribution(double mean) : param_(mean) {}
91
+
92
+ explicit poisson_distribution(const param_type& p) : param_(p) {}
93
+
94
+ void reset() {}
95
+
96
+ // generating functions
97
+ template <typename URBG>
98
+ result_type operator()(URBG& g) { // NOLINT(runtime/references)
99
+ return (*this)(g, param_);
100
+ }
101
+
102
+ template <typename URBG>
103
+ result_type operator()(URBG& g, // NOLINT(runtime/references)
104
+ const param_type& p);
105
+
106
+ param_type param() const { return param_; }
107
+ void param(const param_type& p) { param_ = p; }
108
+
109
+ result_type(min)() const { return 0; }
110
+ result_type(max)() const { return (std::numeric_limits<result_type>::max)(); }
111
+
112
+ double mean() const { return param_.mean(); }
113
+
114
+ friend bool operator==(const poisson_distribution& a,
115
+ const poisson_distribution& b) {
116
+ return a.param_ == b.param_;
117
+ }
118
+ friend bool operator!=(const poisson_distribution& a,
119
+ const poisson_distribution& b) {
120
+ return a.param_ != b.param_;
121
+ }
122
+
123
+ private:
124
+ param_type param_;
125
+ random_internal::FastUniformBits<uint64_t> fast_u64_;
126
+ };
127
+
128
+ // -----------------------------------------------------------------------------
129
+ // Implementation details follow
130
+ // -----------------------------------------------------------------------------
131
+
132
+ template <typename IntType>
133
+ poisson_distribution<IntType>::param_type::param_type(double mean)
134
+ : mean_(mean), split_(0) {
135
+ assert(mean >= 0);
136
+ assert(mean <= (std::numeric_limits<result_type>::max)());
137
+ // As a defensive measure, avoid large values of the mean. The rejection
138
+ // algorithm used does not support very large values well. It my be worth
139
+ // changing algorithms to better deal with these cases.
140
+ assert(mean <= 1e10);
141
+ if (mean_ < 10) {
142
+ // For small lambda, use the knuth method.
143
+ split_ = 1;
144
+ emu_ = std::exp(-mean_);
145
+ } else if (mean_ <= 50) {
146
+ // Use split-knuth method.
147
+ split_ = 1 + static_cast<int>(mean_ / 10.0);
148
+ emu_ = std::exp(-mean_ / static_cast<double>(split_));
149
+ } else {
150
+ // Use ratio of uniforms method.
151
+ constexpr double k2E = 0.7357588823428846;
152
+ constexpr double kSA = 0.4494580810294493;
153
+
154
+ lmu_ = std::log(mean_);
155
+ double a = mean_ + 0.5;
156
+ s_ = kSA + std::sqrt(k2E * a);
157
+ const double mode = std::ceil(mean_) - 1;
158
+ log_k_ = lmu_ * mode - absl::random_internal::StirlingLogFactorial(mode);
159
+ }
160
+ }
161
+
162
+ template <typename IntType>
163
+ template <typename URBG>
164
+ typename poisson_distribution<IntType>::result_type
165
+ poisson_distribution<IntType>::operator()(
166
+ URBG& g, // NOLINT(runtime/references)
167
+ const param_type& p) {
168
+ using random_internal::GeneratePositiveTag;
169
+ using random_internal::GenerateRealFromBits;
170
+ using random_internal::GenerateSignedTag;
171
+
172
+ if (p.split_ != 0) {
173
+ // Use Knuth's algorithm with range splitting to avoid floating-point
174
+ // errors. Knuth's algorithm is: Ui is a sequence of uniform variates on
175
+ // (0,1); return the number of variates required for product(Ui) <
176
+ // exp(-lambda).
177
+ //
178
+ // The expected number of variates required for Knuth's method can be
179
+ // computed as follows:
180
+ // The expected value of U is 0.5, so solving for 0.5^n < exp(-lambda) gives
181
+ // the expected number of uniform variates
182
+ // required for a given lambda, which is:
183
+ // lambda = [2, 5, 9, 10, 11, 12, 13, 14, 15, 16, 17]
184
+ // n = [3, 8, 13, 15, 16, 18, 19, 21, 22, 24, 25]
185
+ //
186
+ result_type n = 0;
187
+ for (int split = p.split_; split > 0; --split) {
188
+ double r = 1.0;
189
+ do {
190
+ r *= GenerateRealFromBits<double, GeneratePositiveTag, true>(
191
+ fast_u64_(g)); // U(-1, 0)
192
+ ++n;
193
+ } while (r > p.emu_);
194
+ --n;
195
+ }
196
+ return n;
197
+ }
198
+
199
+ // Use ratio of uniforms method.
200
+ //
201
+ // Let u ~ Uniform(0, 1), v ~ Uniform(-1, 1),
202
+ // a = lambda + 1/2,
203
+ // s = 1.5 - sqrt(3/e) + sqrt(2(lambda + 1/2)/e),
204
+ // x = s * v/u + a.
205
+ // P(floor(x) = k | u^2 < f(floor(x))/k), where
206
+ // f(m) = lambda^m exp(-lambda)/ m!, for 0 <= m, and f(m) = 0 otherwise,
207
+ // and k = max(f).
208
+ const double a = p.mean_ + 0.5;
209
+ for (;;) {
210
+ const double u = GenerateRealFromBits<double, GeneratePositiveTag, false>(
211
+ fast_u64_(g)); // U(0, 1)
212
+ const double v = GenerateRealFromBits<double, GenerateSignedTag, false>(
213
+ fast_u64_(g)); // U(-1, 1)
214
+
215
+ const double x = std::floor(p.s_ * v / u + a);
216
+ if (x < 0) continue; // f(negative) = 0
217
+ const double rhs = x * p.lmu_;
218
+ // clang-format off
219
+ double s = (x <= 1.0) ? 0.0
220
+ : (x == 2.0) ? 0.693147180559945
221
+ : absl::random_internal::StirlingLogFactorial(x);
222
+ // clang-format on
223
+ const double lhs = 2.0 * std::log(u) + p.log_k_ + s;
224
+ if (lhs < rhs) {
225
+ return x > (max)() ? (max)()
226
+ : static_cast<result_type>(x); // f(x)/k >= u^2
227
+ }
228
+ }
229
+ }
230
+
231
+ template <typename CharT, typename Traits, typename IntType>
232
+ std::basic_ostream<CharT, Traits>& operator<<(
233
+ std::basic_ostream<CharT, Traits>& os, // NOLINT(runtime/references)
234
+ const poisson_distribution<IntType>& x) {
235
+ auto saver = random_internal::make_ostream_state_saver(os);
236
+ os.precision(random_internal::stream_precision_helper<double>::kPrecision);
237
+ os << x.mean();
238
+ return os;
239
+ }
240
+
241
+ template <typename CharT, typename Traits, typename IntType>
242
+ std::basic_istream<CharT, Traits>& operator>>(
243
+ std::basic_istream<CharT, Traits>& is, // NOLINT(runtime/references)
244
+ poisson_distribution<IntType>& x) { // NOLINT(runtime/references)
245
+ using param_type = typename poisson_distribution<IntType>::param_type;
246
+
247
+ auto saver = random_internal::make_istream_state_saver(is);
248
+ double mean = random_internal::read_floating_point<double>(is);
249
+ if (!is.fail()) {
250
+ x.param(param_type(mean));
251
+ }
252
+ return is;
253
+ }
254
+
255
+ ABSL_NAMESPACE_END
256
+ } // namespace absl
257
+
258
+ #endif // ABSL_RANDOM_POISSON_DISTRIBUTION_H_
@@ -0,0 +1,189 @@
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
+ // -----------------------------------------------------------------------------
16
+ // File: random.h
17
+ // -----------------------------------------------------------------------------
18
+ //
19
+ // This header defines the recommended Uniform Random Bit Generator (URBG)
20
+ // types for use within the Abseil Random library. These types are not
21
+ // suitable for security-related use-cases, but should suffice for most other
22
+ // uses of generating random values.
23
+ //
24
+ // The Abseil random library provides the following URBG types:
25
+ //
26
+ // * BitGen, a good general-purpose bit generator, optimized for generating
27
+ // random (but not cryptographically secure) values
28
+ // * InsecureBitGen, a slightly faster, though less random, bit generator, for
29
+ // cases where the existing BitGen is a drag on performance.
30
+
31
+ #ifndef ABSL_RANDOM_RANDOM_H_
32
+ #define ABSL_RANDOM_RANDOM_H_
33
+
34
+ #include <random>
35
+
36
+ #include "absl/random/distributions.h" // IWYU pragma: export
37
+ #include "absl/random/internal/nonsecure_base.h" // IWYU pragma: export
38
+ #include "absl/random/internal/pcg_engine.h" // IWYU pragma: export
39
+ #include "absl/random/internal/pool_urbg.h"
40
+ #include "absl/random/internal/randen_engine.h"
41
+ #include "absl/random/seed_sequences.h" // IWYU pragma: export
42
+
43
+ namespace absl {
44
+ ABSL_NAMESPACE_BEGIN
45
+
46
+ // -----------------------------------------------------------------------------
47
+ // absl::BitGen
48
+ // -----------------------------------------------------------------------------
49
+ //
50
+ // `absl::BitGen` is a general-purpose random bit generator for generating
51
+ // random values for use within the Abseil random library. Typically, you use a
52
+ // bit generator in combination with a distribution to provide random values.
53
+ //
54
+ // Example:
55
+ //
56
+ // // Create an absl::BitGen. There is no need to seed this bit generator.
57
+ // absl::BitGen gen;
58
+ //
59
+ // // Generate an integer value in the closed interval [1,6]
60
+ // int die_roll = absl::uniform_int_distribution<int>(1, 6)(gen);
61
+ //
62
+ // `absl::BitGen` is seeded by default with non-deterministic data to produce
63
+ // different sequences of random values across different instances, including
64
+ // different binary invocations. This behavior is different than the standard
65
+ // library bit generators, which use golden values as their seeds. Default
66
+ // construction intentionally provides no stability guarantees, to avoid
67
+ // accidental dependence on such a property.
68
+ //
69
+ // `absl::BitGen` may be constructed with an optional seed sequence type,
70
+ // conforming to [rand.req.seed_seq], which will be mixed with additional
71
+ // non-deterministic data.
72
+ //
73
+ // Example:
74
+ //
75
+ // // Create an absl::BitGen using an std::seed_seq seed sequence
76
+ // std::seed_seq seq{1,2,3};
77
+ // absl::BitGen gen_with_seed(seq);
78
+ //
79
+ // // Generate an integer value in the closed interval [1,6]
80
+ // int die_roll2 = absl::uniform_int_distribution<int>(1, 6)(gen_with_seed);
81
+ //
82
+ // `absl::BitGen` meets the requirements of the Uniform Random Bit Generator
83
+ // (URBG) concept as per the C++17 standard [rand.req.urng] though differs
84
+ // slightly with [rand.req.eng]. Like its standard library equivalents (e.g.
85
+ // `std::mersenne_twister_engine`) `absl::BitGen` is not cryptographically
86
+ // secure.
87
+ //
88
+ // Constructing two `absl::BitGen`s with the same seed sequence in the same
89
+ // binary will produce the same sequence of variates within the same binary, but
90
+ // need not do so across multiple binary invocations.
91
+ //
92
+ // This type has been optimized to perform better than Mersenne Twister
93
+ // (https://en.wikipedia.org/wiki/Mersenne_Twister) and many other complex URBG
94
+ // types on modern x86, ARM, and PPC architectures.
95
+ //
96
+ // This type is thread-compatible, but not thread-safe.
97
+
98
+ // ---------------------------------------------------------------------------
99
+ // absl::BitGen member functions
100
+ // ---------------------------------------------------------------------------
101
+
102
+ // absl::BitGen::operator()()
103
+ //
104
+ // Calls the BitGen, returning a generated value.
105
+
106
+ // absl::BitGen::min()
107
+ //
108
+ // Returns the smallest possible value from this bit generator.
109
+
110
+ // absl::BitGen::max()
111
+ //
112
+ // Returns the largest possible value from this bit generator.
113
+
114
+ // absl::BitGen::discard(num)
115
+ //
116
+ // Advances the internal state of this bit generator by `num` times, and
117
+ // discards the intermediate results.
118
+ // ---------------------------------------------------------------------------
119
+
120
+ using BitGen = random_internal::NonsecureURBGBase<
121
+ random_internal::randen_engine<uint64_t>>;
122
+
123
+ // -----------------------------------------------------------------------------
124
+ // absl::InsecureBitGen
125
+ // -----------------------------------------------------------------------------
126
+ //
127
+ // `absl::InsecureBitGen` is an efficient random bit generator for generating
128
+ // random values, recommended only for performance-sensitive use cases where
129
+ // `absl::BitGen` is not satisfactory when compute-bounded by bit generation
130
+ // costs.
131
+ //
132
+ // Example:
133
+ //
134
+ // // Create an absl::InsecureBitGen
135
+ // absl::InsecureBitGen gen;
136
+ // for (size_t i = 0; i < 1000000; i++) {
137
+ //
138
+ // // Generate a bunch of random values from some complex distribution
139
+ // auto my_rnd = some_distribution(gen, 1, 1000);
140
+ // }
141
+ //
142
+ // Like `absl::BitGen`, `absl::InsecureBitGen` is seeded by default with
143
+ // non-deterministic data to produce different sequences of random values across
144
+ // different instances, including different binary invocations. (This behavior
145
+ // is different than the standard library bit generators, which use golden
146
+ // values as their seeds.)
147
+ //
148
+ // `absl::InsecureBitGen` may be constructed with an optional seed sequence
149
+ // type, conforming to [rand.req.seed_seq], which will be mixed with additional
150
+ // non-deterministic data. (See std_seed_seq.h for more information.)
151
+ //
152
+ // `absl::InsecureBitGen` meets the requirements of the Uniform Random Bit
153
+ // Generator (URBG) concept as per the C++17 standard [rand.req.urng] though
154
+ // its implementation differs slightly with [rand.req.eng]. Like its standard
155
+ // library equivalents (e.g. `std::mersenne_twister_engine`)
156
+ // `absl::InsecureBitGen` is not cryptographically secure.
157
+ //
158
+ // Prefer `absl::BitGen` over `absl::InsecureBitGen` as the general type is
159
+ // often fast enough for the vast majority of applications.
160
+
161
+ using InsecureBitGen =
162
+ random_internal::NonsecureURBGBase<random_internal::pcg64_2018_engine>;
163
+
164
+ // ---------------------------------------------------------------------------
165
+ // absl::InsecureBitGen member functions
166
+ // ---------------------------------------------------------------------------
167
+
168
+ // absl::InsecureBitGen::operator()()
169
+ //
170
+ // Calls the InsecureBitGen, returning a generated value.
171
+
172
+ // absl::InsecureBitGen::min()
173
+ //
174
+ // Returns the smallest possible value from this bit generator.
175
+
176
+ // absl::InsecureBitGen::max()
177
+ //
178
+ // Returns the largest possible value from this bit generator.
179
+
180
+ // absl::InsecureBitGen::discard(num)
181
+ //
182
+ // Advances the internal state of this bit generator by `num` times, and
183
+ // discards the intermediate results.
184
+ // ---------------------------------------------------------------------------
185
+
186
+ ABSL_NAMESPACE_END
187
+ } // namespace absl
188
+
189
+ #endif // ABSL_RANDOM_RANDOM_H_
@@ -0,0 +1,46 @@
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/seed_gen_exception.h"
16
+
17
+ #include <iostream>
18
+
19
+ #include "absl/base/config.h"
20
+
21
+ namespace absl {
22
+ ABSL_NAMESPACE_BEGIN
23
+
24
+ static constexpr const char kExceptionMessage[] =
25
+ "Failed generating seed-material for URBG.";
26
+
27
+ SeedGenException::~SeedGenException() = default;
28
+
29
+ const char* SeedGenException::what() const noexcept {
30
+ return kExceptionMessage;
31
+ }
32
+
33
+ namespace random_internal {
34
+
35
+ void ThrowSeedGenException() {
36
+ #ifdef ABSL_HAVE_EXCEPTIONS
37
+ throw absl::SeedGenException();
38
+ #else
39
+ std::cerr << kExceptionMessage << std::endl;
40
+ std::terminate();
41
+ #endif
42
+ }
43
+
44
+ } // namespace random_internal
45
+ ABSL_NAMESPACE_END
46
+ } // namespace absl
@@ -0,0 +1,55 @@
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
+ // -----------------------------------------------------------------------------
16
+ // File: seed_gen_exception.h
17
+ // -----------------------------------------------------------------------------
18
+ //
19
+ // This header defines an exception class which may be thrown if unpredictable
20
+ // events prevent the derivation of suitable seed-material for constructing a
21
+ // bit generator conforming to [rand.req.urng] (eg. entropy cannot be read from
22
+ // /dev/urandom on a Unix-based system).
23
+ //
24
+ // Note: if exceptions are disabled, `std::terminate()` is called instead.
25
+
26
+ #ifndef ABSL_RANDOM_SEED_GEN_EXCEPTION_H_
27
+ #define ABSL_RANDOM_SEED_GEN_EXCEPTION_H_
28
+
29
+ #include <exception>
30
+
31
+ #include "absl/base/config.h"
32
+
33
+ namespace absl {
34
+ ABSL_NAMESPACE_BEGIN
35
+
36
+ //------------------------------------------------------------------------------
37
+ // SeedGenException
38
+ //------------------------------------------------------------------------------
39
+ class SeedGenException : public std::exception {
40
+ public:
41
+ SeedGenException() = default;
42
+ ~SeedGenException() override;
43
+ const char* what() const noexcept override;
44
+ };
45
+
46
+ namespace random_internal {
47
+
48
+ // throw delegator
49
+ [[noreturn]] void ThrowSeedGenException();
50
+
51
+ } // namespace random_internal
52
+ ABSL_NAMESPACE_END
53
+ } // namespace absl
54
+
55
+ #endif // ABSL_RANDOM_SEED_GEN_EXCEPTION_H_
@@ -0,0 +1,29 @@
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/seed_sequences.h"
16
+
17
+ #include "absl/random/internal/pool_urbg.h"
18
+
19
+ namespace absl {
20
+ ABSL_NAMESPACE_BEGIN
21
+
22
+ SeedSeq MakeSeedSeq() {
23
+ SeedSeq::result_type seed_material[8];
24
+ random_internal::RandenPool<uint32_t>::Fill(absl::MakeSpan(seed_material));
25
+ return SeedSeq(std::begin(seed_material), std::end(seed_material));
26
+ }
27
+
28
+ ABSL_NAMESPACE_END
29
+ } // namespace absl
@@ -0,0 +1,110 @@
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
+ // -----------------------------------------------------------------------------
16
+ // File: seed_sequences.h
17
+ // -----------------------------------------------------------------------------
18
+ //
19
+ // This header contains utilities for creating and working with seed sequences
20
+ // conforming to [rand.req.seedseq]. In general, direct construction of seed
21
+ // sequences is discouraged, but use-cases for construction of identical bit
22
+ // generators (using the same seed sequence) may be helpful (e.g. replaying a
23
+ // simulation whose state is derived from variates of a bit generator).
24
+
25
+ #ifndef ABSL_RANDOM_SEED_SEQUENCES_H_
26
+ #define ABSL_RANDOM_SEED_SEQUENCES_H_
27
+
28
+ #include <iterator>
29
+ #include <random>
30
+
31
+ #include "absl/random/internal/salted_seed_seq.h"
32
+ #include "absl/random/internal/seed_material.h"
33
+ #include "absl/random/seed_gen_exception.h"
34
+ #include "absl/types/span.h"
35
+
36
+ namespace absl {
37
+ ABSL_NAMESPACE_BEGIN
38
+
39
+ // -----------------------------------------------------------------------------
40
+ // absl::SeedSeq
41
+ // -----------------------------------------------------------------------------
42
+ //
43
+ // `absl::SeedSeq` constructs a seed sequence according to [rand.req.seedseq]
44
+ // for use within bit generators. `absl::SeedSeq`, unlike `std::seed_seq`
45
+ // additionally salts the generated seeds with extra implementation-defined
46
+ // entropy. For that reason, you can use `absl::SeedSeq` in combination with
47
+ // standard library bit generators (e.g. `std::mt19937`) to introduce
48
+ // non-determinism in your seeds.
49
+ //
50
+ // Example:
51
+ //
52
+ // absl::SeedSeq my_seed_seq({a, b, c});
53
+ // std::mt19937 my_bitgen(my_seed_seq);
54
+ //
55
+ using SeedSeq = random_internal::SaltedSeedSeq<std::seed_seq>;
56
+
57
+ // -----------------------------------------------------------------------------
58
+ // absl::CreateSeedSeqFrom(bitgen*)
59
+ // -----------------------------------------------------------------------------
60
+ //
61
+ // Constructs a seed sequence conforming to [rand.req.seedseq] using variates
62
+ // produced by a provided bit generator.
63
+ //
64
+ // You should generally avoid direct construction of seed sequences, but
65
+ // use-cases for reuse of a seed sequence to construct identical bit generators
66
+ // may be helpful (eg. replaying a simulation whose state is derived from bit
67
+ // generator values).
68
+ //
69
+ // If bitgen == nullptr, then behavior is undefined.
70
+ //
71
+ // Example:
72
+ //
73
+ // absl::BitGen my_bitgen;
74
+ // auto seed_seq = absl::CreateSeedSeqFrom(&my_bitgen);
75
+ // absl::BitGen new_engine(seed_seq); // derived from my_bitgen, but not
76
+ // // correlated.
77
+ //
78
+ template <typename URBG>
79
+ SeedSeq CreateSeedSeqFrom(URBG* urbg) {
80
+ SeedSeq::result_type
81
+ seed_material[random_internal::kEntropyBlocksNeeded];
82
+
83
+ if (!random_internal::ReadSeedMaterialFromURBG(
84
+ urbg, absl::MakeSpan(seed_material))) {
85
+ random_internal::ThrowSeedGenException();
86
+ }
87
+ return SeedSeq(std::begin(seed_material), std::end(seed_material));
88
+ }
89
+
90
+ // -----------------------------------------------------------------------------
91
+ // absl::MakeSeedSeq()
92
+ // -----------------------------------------------------------------------------
93
+ //
94
+ // Constructs an `absl::SeedSeq` salting the generated values using
95
+ // implementation-defined entropy. The returned sequence can be used to create
96
+ // equivalent bit generators correlated using this sequence.
97
+ //
98
+ // Example:
99
+ //
100
+ // auto my_seed_seq = absl::MakeSeedSeq();
101
+ // std::mt19937 rng1(my_seed_seq);
102
+ // std::mt19937 rng2(my_seed_seq);
103
+ // EXPECT_EQ(rng1(), rng2());
104
+ //
105
+ SeedSeq MakeSeedSeq();
106
+
107
+ ABSL_NAMESPACE_END
108
+ } // namespace absl
109
+
110
+ #endif // ABSL_RANDOM_SEED_SEQUENCES_H_