grpc 1.53.2 → 1.54.0

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 (693) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +78 -66
  3. data/include/grpc/event_engine/event_engine.h +30 -14
  4. data/include/grpc/grpc_security.h +4 -0
  5. data/include/grpc/support/port_platform.h +4 -4
  6. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +11 -0
  7. data/src/core/ext/filters/client_channel/backend_metric.cc +6 -0
  8. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -11
  9. data/src/core/ext/filters/client_channel/backup_poller.h +0 -3
  10. data/src/core/ext/filters/client_channel/client_channel.cc +848 -813
  11. data/src/core/ext/filters/client_channel/client_channel.h +131 -173
  12. data/src/core/ext/filters/client_channel/client_channel_internal.h +114 -0
  13. data/src/core/ext/filters/client_channel/config_selector.h +4 -3
  14. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +6 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +17 -18
  16. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +134 -151
  17. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2 -16
  18. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +14 -10
  19. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +68 -30
  20. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -3
  21. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +8 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +2 -5
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +2 -2
  24. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +30 -38
  25. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +4 -4
  26. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +20 -26
  27. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +31 -179
  28. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -2
  29. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +1 -2
  30. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +4 -2
  31. data/src/core/ext/filters/client_channel/retry_filter.cc +95 -102
  32. data/src/core/ext/filters/client_channel/subchannel.cc +2 -4
  33. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +26 -27
  34. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +8 -5
  35. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -3
  36. data/src/core/ext/filters/http/http_filters_plugin.cc +1 -12
  37. data/src/core/ext/filters/http/message_compress/compression_filter.cc +27 -11
  38. data/src/core/ext/filters/message_size/message_size_filter.cc +141 -224
  39. data/src/core/ext/filters/message_size/message_size_filter.h +48 -3
  40. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -6
  41. data/src/core/ext/gcp/metadata_query.cc +142 -0
  42. data/src/core/ext/gcp/metadata_query.h +82 -0
  43. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +70 -55
  44. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +8 -12
  45. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -5
  46. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +116 -58
  47. data/src/core/ext/transport/chttp2/transport/flow_control.cc +5 -2
  48. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -1
  49. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +4 -1
  50. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +222 -118
  51. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +113 -295
  52. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +0 -2
  53. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +0 -2
  54. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +277 -451
  55. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -3
  56. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -14
  57. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -9
  58. data/src/core/ext/transport/chttp2/transport/internal.h +16 -3
  59. data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
  60. data/src/core/ext/transport/chttp2/transport/writing.cc +10 -5
  61. data/src/core/ext/transport/inproc/inproc_transport.cc +20 -14
  62. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +5 -3
  63. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +22 -0
  64. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +5 -3
  65. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +22 -0
  66. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +23 -5
  67. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +94 -3
  68. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -2
  69. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +120 -0
  70. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +6 -3
  71. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +22 -0
  72. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +24 -6
  73. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +111 -12
  74. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +9 -7
  75. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +27 -9
  76. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +0 -1
  77. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +11 -7
  78. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +56 -12
  79. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +5 -3
  80. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +24 -0
  81. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +5 -3
  82. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +24 -0
  83. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +13 -2
  84. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +49 -0
  85. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +24 -9
  86. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +66 -12
  87. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +191 -187
  88. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +139 -136
  89. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +31 -15
  90. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +5 -0
  91. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +12 -9
  92. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +15 -0
  93. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +54 -45
  94. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +135 -119
  95. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  96. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +100 -97
  97. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +15 -18
  98. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +272 -264
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +117 -117
  100. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +5 -5
  101. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +5 -5
  102. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +5 -5
  103. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +12 -9
  104. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +5 -0
  105. data/src/core/ext/xds/xds_channel_stack_modifier.cc +1 -2
  106. data/src/core/ext/xds/xds_client_stats.cc +29 -15
  107. data/src/core/ext/xds/xds_client_stats.h +24 -20
  108. data/src/core/ext/xds/xds_endpoint.cc +5 -2
  109. data/src/core/ext/xds/xds_endpoint.h +9 -1
  110. data/src/core/ext/xds/xds_http_rbac_filter.cc +1 -1
  111. data/src/core/ext/xds/xds_lb_policy_registry.cc +13 -0
  112. data/src/core/ext/xds/xds_transport_grpc.cc +1 -1
  113. data/src/core/lib/channel/call_finalization.h +1 -1
  114. data/src/core/lib/channel/call_tracer.cc +51 -0
  115. data/src/core/lib/channel/call_tracer.h +101 -38
  116. data/src/core/lib/channel/connected_channel.cc +483 -1050
  117. data/src/core/lib/channel/context.h +8 -1
  118. data/src/core/lib/channel/promise_based_filter.cc +106 -42
  119. data/src/core/lib/channel/promise_based_filter.h +27 -13
  120. data/src/core/lib/channel/server_call_tracer_filter.cc +110 -0
  121. data/src/core/lib/config/config_vars.cc +151 -0
  122. data/src/core/lib/config/config_vars.h +127 -0
  123. data/src/core/lib/config/config_vars_non_generated.cc +51 -0
  124. data/src/core/lib/config/load_config.cc +66 -0
  125. data/src/core/lib/config/load_config.h +49 -0
  126. data/src/core/lib/debug/trace.cc +5 -6
  127. data/src/core/lib/debug/trace.h +0 -5
  128. data/src/core/lib/event_engine/event_engine.cc +37 -2
  129. data/src/core/lib/event_engine/handle_containers.h +7 -22
  130. data/src/core/lib/event_engine/memory_allocator_factory.h +47 -0
  131. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +0 -4
  132. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +3 -9
  133. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +48 -15
  134. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +8 -8
  135. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -5
  136. data/src/core/lib/event_engine/posix_engine/posix_engine.h +0 -1
  137. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +6 -32
  138. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +0 -3
  139. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +27 -18
  140. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +0 -3
  141. data/src/core/lib/event_engine/resolved_address.cc +2 -1
  142. data/src/core/lib/event_engine/windows/win_socket.cc +0 -1
  143. data/src/core/lib/event_engine/windows/windows_endpoint.cc +129 -82
  144. data/src/core/lib/event_engine/windows/windows_endpoint.h +21 -5
  145. data/src/core/lib/event_engine/windows/windows_engine.cc +39 -18
  146. data/src/core/lib/event_engine/windows/windows_engine.h +2 -1
  147. data/src/core/lib/event_engine/windows/windows_listener.cc +370 -0
  148. data/src/core/lib/event_engine/windows/windows_listener.h +155 -0
  149. data/src/core/lib/experiments/config.cc +3 -10
  150. data/src/core/lib/experiments/experiments.cc +7 -0
  151. data/src/core/lib/experiments/experiments.h +9 -1
  152. data/src/core/lib/gpr/log.cc +15 -28
  153. data/src/core/lib/gprpp/fork.cc +8 -14
  154. data/src/core/lib/gprpp/orphanable.h +4 -3
  155. data/src/core/lib/gprpp/per_cpu.h +9 -3
  156. data/src/core/lib/gprpp/{thd_posix.cc → posix/thd.cc} +49 -37
  157. data/src/core/lib/gprpp/ref_counted.h +33 -34
  158. data/src/core/lib/gprpp/thd.h +16 -0
  159. data/src/core/lib/gprpp/time.cc +1 -0
  160. data/src/core/lib/gprpp/time.h +4 -4
  161. data/src/core/lib/gprpp/{thd_windows.cc → windows/thd.cc} +2 -2
  162. data/src/core/lib/iomgr/call_combiner.h +2 -2
  163. data/src/core/lib/iomgr/endpoint_cfstream.cc +4 -2
  164. data/src/core/lib/iomgr/ev_posix.cc +13 -53
  165. data/src/core/lib/iomgr/ev_posix.h +0 -3
  166. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +103 -76
  167. data/src/core/lib/iomgr/iomgr.cc +4 -8
  168. data/src/core/lib/iomgr/iomgr_windows.cc +8 -2
  169. data/src/core/lib/iomgr/pollset_set_windows.cc +9 -9
  170. data/src/core/lib/iomgr/pollset_windows.cc +1 -1
  171. data/src/core/lib/iomgr/socket_utils_common_posix.cc +16 -3
  172. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -2
  173. data/src/core/lib/iomgr/tcp_posix.cc +0 -1
  174. data/src/core/lib/iomgr/tcp_server_posix.cc +19 -55
  175. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -12
  176. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +0 -21
  177. data/src/core/lib/iomgr/tcp_server_windows.cc +176 -9
  178. data/src/core/lib/iomgr/tcp_windows.cc +12 -8
  179. data/src/core/lib/load_balancing/lb_policy.cc +9 -13
  180. data/src/core/lib/load_balancing/lb_policy.h +4 -2
  181. data/src/core/lib/promise/activity.cc +22 -6
  182. data/src/core/lib/promise/activity.h +61 -24
  183. data/src/core/lib/promise/cancel_callback.h +77 -0
  184. data/src/core/lib/promise/detail/basic_seq.h +1 -1
  185. data/src/core/lib/promise/detail/promise_factory.h +4 -0
  186. data/src/core/lib/promise/for_each.h +176 -0
  187. data/src/core/lib/promise/if.h +9 -0
  188. data/src/core/lib/promise/interceptor_list.h +23 -2
  189. data/src/core/lib/promise/latch.h +89 -3
  190. data/src/core/lib/promise/loop.h +13 -9
  191. data/src/core/lib/promise/map.h +7 -0
  192. data/src/core/lib/promise/party.cc +286 -0
  193. data/src/core/lib/promise/party.h +499 -0
  194. data/src/core/lib/promise/pipe.h +197 -57
  195. data/src/core/lib/promise/poll.h +48 -0
  196. data/src/core/lib/promise/promise.h +2 -2
  197. data/src/core/lib/resource_quota/arena.cc +19 -3
  198. data/src/core/lib/resource_quota/arena.h +119 -5
  199. data/src/core/lib/resource_quota/memory_quota.cc +1 -1
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +12 -35
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -0
  202. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +0 -59
  203. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -5
  204. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  205. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +13 -0
  206. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +2 -0
  207. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +5 -9
  208. data/src/core/lib/security/security_connector/ssl_utils.cc +11 -25
  209. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +12 -0
  210. data/src/core/lib/security/transport/secure_endpoint.cc +4 -2
  211. data/src/core/lib/security/transport/server_auth_filter.cc +20 -2
  212. data/src/core/lib/slice/slice.cc +1 -1
  213. data/src/core/lib/surface/builtins.cc +2 -0
  214. data/src/core/lib/surface/call.cc +926 -1024
  215. data/src/core/lib/surface/call.h +10 -0
  216. data/src/core/lib/surface/lame_client.cc +1 -0
  217. data/src/core/lib/surface/validate_metadata.cc +42 -43
  218. data/src/core/lib/surface/validate_metadata.h +0 -9
  219. data/src/core/lib/surface/version.cc +2 -2
  220. data/src/core/lib/transport/batch_builder.cc +179 -0
  221. data/src/core/lib/transport/batch_builder.h +468 -0
  222. data/src/core/lib/transport/bdp_estimator.cc +7 -7
  223. data/src/core/lib/transport/bdp_estimator.h +10 -6
  224. data/src/core/lib/transport/custom_metadata.h +30 -0
  225. data/src/core/lib/transport/metadata_batch.cc +5 -2
  226. data/src/core/lib/transport/metadata_batch.h +17 -113
  227. data/src/core/lib/transport/parsed_metadata.h +6 -16
  228. data/src/core/lib/transport/timeout_encoding.cc +6 -1
  229. data/src/core/lib/transport/transport.cc +30 -2
  230. data/src/core/lib/transport/transport.h +70 -14
  231. data/src/core/lib/transport/transport_impl.h +7 -0
  232. data/src/core/lib/transport/transport_op_string.cc +52 -42
  233. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -2
  234. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +1 -0
  235. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +21 -4
  236. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +5 -0
  237. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  238. data/src/core/tsi/ssl_transport_security.cc +4 -2
  239. data/src/ruby/lib/grpc/version.rb +1 -1
  240. data/third_party/abseil-cpp/absl/base/config.h +1 -1
  241. data/third_party/abseil-cpp/absl/flags/commandlineflag.cc +34 -0
  242. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +200 -0
  243. data/third_party/abseil-cpp/absl/flags/config.h +68 -0
  244. data/third_party/abseil-cpp/absl/flags/declare.h +73 -0
  245. data/third_party/abseil-cpp/absl/flags/flag.cc +38 -0
  246. data/third_party/abseil-cpp/absl/flags/flag.h +310 -0
  247. data/{src/core/lib/gprpp/global_config_custom.h → third_party/abseil-cpp/absl/flags/internal/commandlineflag.cc} +11 -14
  248. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +68 -0
  249. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +615 -0
  250. data/third_party/abseil-cpp/absl/flags/internal/flag.h +800 -0
  251. data/third_party/abseil-cpp/absl/flags/internal/flag_msvc.inc +116 -0
  252. data/third_party/abseil-cpp/absl/flags/internal/path_util.h +62 -0
  253. data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.cc +65 -0
  254. data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.h +61 -0
  255. data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +60 -0
  256. data/third_party/abseil-cpp/absl/flags/internal/program_name.h +50 -0
  257. data/third_party/abseil-cpp/absl/flags/internal/registry.h +97 -0
  258. data/third_party/abseil-cpp/absl/flags/internal/sequence_lock.h +187 -0
  259. data/third_party/abseil-cpp/absl/flags/marshalling.cc +241 -0
  260. data/third_party/abseil-cpp/absl/flags/marshalling.h +356 -0
  261. data/third_party/abseil-cpp/absl/flags/reflection.cc +354 -0
  262. data/third_party/abseil-cpp/absl/flags/reflection.h +90 -0
  263. data/third_party/abseil-cpp/absl/flags/usage_config.cc +165 -0
  264. data/third_party/abseil-cpp/absl/flags/usage_config.h +135 -0
  265. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +12 -8
  266. data/third_party/boringssl-with-bazel/err_data.c +728 -712
  267. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +177 -177
  268. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +28 -55
  269. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +21 -23
  270. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c +20 -23
  271. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +66 -185
  272. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c +18 -21
  273. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +356 -311
  274. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +174 -194
  275. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +146 -210
  276. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +6 -9
  277. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.c +346 -526
  278. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +110 -131
  279. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +130 -116
  280. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +93 -60
  281. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +93 -181
  282. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +242 -305
  283. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +41 -18
  284. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +30 -33
  285. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +36 -33
  286. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +29 -26
  287. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +133 -88
  288. data/third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.c +230 -0
  289. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +791 -791
  290. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +526 -526
  291. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +114 -135
  292. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +201 -207
  293. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +21 -26
  294. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +55 -68
  295. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +2 -4
  296. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +11 -7
  297. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +4 -4
  298. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +15 -9
  299. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +4 -4
  300. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +17 -10
  301. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -3
  302. data/third_party/boringssl-with-bazel/src/crypto/bio/printf.c +0 -13
  303. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -6
  304. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +2 -0
  305. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +9 -5
  306. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c +10 -23
  307. data/third_party/boringssl-with-bazel/src/crypto/buf/buf.c +2 -6
  308. data/third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c +2 -1
  309. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +29 -28
  310. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +161 -201
  311. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +254 -39
  312. data/third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h +2 -2
  313. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +0 -2
  314. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +4 -4
  315. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c +9 -8
  316. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c +37 -75
  317. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +8 -10
  318. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/cipher → cipher_extra}/e_des.c +100 -78
  319. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c +1 -0
  320. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c +1 -0
  321. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c +2 -0
  322. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +6 -12
  323. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -11
  324. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +6 -10
  325. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -1
  326. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +12 -0
  327. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +74 -0
  328. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_freebsd.c +62 -0
  329. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-fuchsia.c → cpu_aarch64_fuchsia.c} +8 -7
  330. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-linux.c → cpu_aarch64_linux.c} +6 -4
  331. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-win.c → cpu_aarch64_win.c} +4 -4
  332. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm.c → cpu_arm.c} +1 -1
  333. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c +55 -0
  334. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm-linux.c → cpu_arm_linux.c} +11 -90
  335. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm-linux.h → cpu_arm_linux.h} +0 -38
  336. data/third_party/boringssl-with-bazel/src/crypto/{cpu-intel.c → cpu_intel.c} +1 -2
  337. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +25 -20
  338. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +16 -27
  339. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +17 -32
  340. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/des → des}/des.c +232 -232
  341. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/des → des}/internal.h +1 -1
  342. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c +1 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c +232 -29
  344. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +0 -3
  345. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +39 -16
  346. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +37 -7
  347. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +3 -3
  348. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +11 -36
  349. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +214 -99
  350. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +21 -5
  351. data/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c +2 -4
  352. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +83 -60
  353. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +46 -12
  354. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +3 -3
  355. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c +25 -23
  356. data/third_party/boringssl-with-bazel/src/crypto/evp/internal.h +43 -9
  357. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +75 -44
  358. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +19 -25
  359. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c +96 -45
  360. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c +7 -8
  361. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c +26 -23
  362. data/third_party/boringssl-with-bazel/src/crypto/evp/p_hkdf.c +233 -0
  363. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +5 -5
  364. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c +42 -25
  365. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c +4 -5
  366. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c +35 -47
  367. data/third_party/boringssl-with-bazel/src/crypto/evp/print.c +135 -244
  368. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +2 -4
  369. data/third_party/boringssl-with-bazel/src/crypto/evp/sign.c +15 -10
  370. data/third_party/boringssl-with-bazel/src/crypto/ex_data.c +29 -15
  371. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +0 -2
  372. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +13 -14
  373. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +3 -13
  374. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.c +13 -7
  375. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +9 -7
  376. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +35 -27
  377. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +16 -26
  378. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.c +88 -60
  379. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.c +4 -3
  380. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c +0 -2
  381. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +1 -1
  382. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.c +1 -1
  383. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +99 -113
  384. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +0 -1
  385. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +5 -3
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.c +112 -168
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +86 -31
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +11 -6
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +4 -5
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +4 -5
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +13 -0
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c +13 -5
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c +19 -108
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.h +19 -15
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.c +15 -16
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +22 -21
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/aead.c +3 -0
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +79 -19
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +102 -99
  400. data/third_party/boringssl-with-bazel/src/crypto/{cipher_extra → fipsmodule/cipher}/e_aesccm.c +52 -46
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h +39 -0
  402. data/third_party/boringssl-with-bazel/src/crypto/{cmac → fipsmodule/cmac}/cmac.c +55 -11
  403. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c +2 -3
  404. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +21 -6
  405. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +56 -0
  406. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +5 -3
  407. data/third_party/boringssl-with-bazel/src/crypto/{evp → fipsmodule/digestsign}/digestsign.c +51 -15
  408. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +25 -25
  409. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +91 -17
  410. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +5 -5
  411. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +34 -12
  412. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +54 -23
  413. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +44 -60
  414. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64-table.h → p256-nistz-table.h} +1 -1
  415. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64.c → p256-nistz.c} +60 -53
  416. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64.h → p256-nistz.h} +5 -13
  417. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +48 -36
  418. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +2 -8
  419. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +2 -7
  420. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -3
  421. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +0 -1
  422. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +8 -0
  423. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +42 -14
  424. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +6 -0
  425. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/hmac.c +52 -24
  426. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +9 -15
  427. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +1 -4
  428. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +2 -4
  429. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +71 -43
  430. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +14 -16
  431. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -4
  432. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.c +31 -13
  433. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +16 -8
  434. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +3 -2
  435. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +2 -2
  436. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +9 -38
  437. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +73 -59
  438. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -45
  439. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +0 -1
  440. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +22 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +63 -52
  442. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +107 -62
  443. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +58 -31
  444. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +41 -0
  445. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +523 -422
  446. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/internal.h +89 -0
  447. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/service_indicator.c +334 -0
  448. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +3 -12
  449. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +2 -0
  450. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +12 -8
  451. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +14 -12
  452. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +19 -6
  453. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +32 -14
  454. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +65 -29
  455. data/third_party/boringssl-with-bazel/src/crypto/internal.h +373 -18
  456. data/third_party/boringssl-with-bazel/src/crypto/kyber/internal.h +61 -0
  457. data/third_party/boringssl-with-bazel/src/crypto/kyber/keccak.c +205 -0
  458. data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +13 -1
  459. data/third_party/boringssl-with-bazel/src/crypto/mem.c +220 -13
  460. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +19 -7
  461. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +13 -1
  462. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +81 -90
  463. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +150 -245
  464. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +629 -613
  465. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c +17 -17
  466. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +142 -149
  467. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +99 -131
  468. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c +0 -1
  469. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c +0 -1
  470. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +0 -1
  471. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +0 -3
  472. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -66
  473. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +31 -38
  474. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +2 -1
  475. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +18 -31
  476. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -0
  477. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +8 -1
  478. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +129 -5
  479. data/third_party/boringssl-with-bazel/src/crypto/refcount_c11.c +0 -2
  480. data/third_party/boringssl-with-bazel/src/crypto/refcount_lock.c +3 -4
  481. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +8 -11
  482. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +61 -27
  483. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +10 -13
  484. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +10 -13
  485. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +66 -34
  486. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +190 -77
  487. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +81 -284
  488. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +109 -42
  489. data/third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c +22 -24
  490. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +54 -55
  491. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +32 -34
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +32 -16
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +465 -704
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +284 -331
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +183 -178
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c +11 -15
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +67 -50
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +153 -150
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/policy.c +786 -0
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +95 -102
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +72 -57
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +12 -10
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +227 -252
  504. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +52 -47
  505. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +3 -4
  506. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +230 -224
  507. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +161 -327
  508. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c +37 -33
  509. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c +14 -31
  510. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +55 -85
  511. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +534 -618
  512. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +129 -122
  513. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +116 -182
  514. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +132 -132
  515. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +181 -202
  516. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +64 -79
  517. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +175 -160
  518. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1865 -2050
  519. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +433 -462
  520. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +156 -163
  521. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +267 -263
  522. data/third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c +40 -15
  523. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +59 -63
  524. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +63 -67
  525. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +114 -144
  526. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +25 -26
  527. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +326 -415
  528. data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +8 -7
  529. data/third_party/boringssl-with-bazel/src/crypto/x509/x_info.c +30 -28
  530. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +354 -370
  531. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +37 -32
  532. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +116 -119
  533. data/third_party/boringssl-with-bazel/src/crypto/x509/x_req.c +36 -26
  534. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +3 -4
  535. data/third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c +10 -13
  536. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +3 -4
  537. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +419 -261
  538. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +113 -105
  539. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +11 -15
  540. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +78 -170
  541. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +126 -131
  542. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c +3 -4
  543. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +465 -469
  544. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c +56 -54
  545. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +46 -49
  546. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +309 -346
  547. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +341 -365
  548. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +429 -393
  549. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +29 -24
  550. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c +65 -59
  551. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +125 -121
  552. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +43 -42
  553. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +122 -125
  554. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c +50 -20
  555. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +247 -253
  556. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +386 -389
  557. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c +45 -32
  558. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c +57 -54
  559. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c +63 -67
  560. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +143 -136
  561. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +664 -707
  562. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +83 -75
  563. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1062 -1146
  564. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +8 -4
  565. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +28 -48
  566. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +211 -187
  567. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +26 -78
  568. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +19 -14
  569. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +21 -2
  570. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +49 -17
  571. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +99 -29
  572. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +49 -60
  573. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +2 -15
  574. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +16 -200
  575. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +34 -0
  576. data/third_party/boringssl-with-bazel/src/include/openssl/ctrdrbg.h +82 -0
  577. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +32 -30
  578. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +7 -0
  579. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +4 -0
  580. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +48 -5
  581. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +37 -8
  582. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +1 -0
  583. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +33 -5
  584. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +22 -30
  585. data/third_party/boringssl-with-bazel/src/include/openssl/ex_data.h +1 -1
  586. data/third_party/boringssl-with-bazel/src/include/openssl/hmac.h +7 -0
  587. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +41 -16
  588. data/third_party/boringssl-with-bazel/src/include/openssl/kdf.h +91 -0
  589. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +74 -8
  590. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +13 -0
  591. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +1 -0
  592. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +11 -15
  593. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +8 -0
  594. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +12 -1
  595. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +7 -4
  596. data/third_party/boringssl-with-bazel/src/include/openssl/service_indicator.h +96 -0
  597. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +13 -21
  598. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +139 -75
  599. data/third_party/boringssl-with-bazel/src/include/openssl/ssl3.h +1 -6
  600. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +384 -286
  601. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +5 -6
  602. data/third_party/boringssl-with-bazel/src/include/openssl/time.h +41 -0
  603. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +18 -7
  604. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +49 -23
  605. data/third_party/boringssl-with-bazel/src/include/openssl/type_check.h +0 -11
  606. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +1592 -1074
  607. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +202 -205
  608. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +2 -2
  609. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +6 -13
  610. data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +17 -18
  611. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +4 -5
  612. data/third_party/boringssl-with-bazel/src/ssl/dtls_record.cc +25 -33
  613. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +34 -20
  614. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +65 -34
  615. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +198 -54
  616. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +5 -5
  617. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +32 -28
  618. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +76 -44
  619. data/third_party/boringssl-with-bazel/src/ssl/internal.h +130 -98
  620. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +27 -11
  621. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  622. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +91 -75
  623. data/third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc +8 -10
  624. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +39 -65
  625. data/third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc +1 -0
  626. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +5 -9
  627. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +30 -33
  628. data/third_party/boringssl-with-bazel/src/ssl/ssl_file.cc +77 -100
  629. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +120 -107
  630. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +164 -30
  631. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +150 -60
  632. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +22 -11
  633. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +22 -6
  634. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +15 -13
  635. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +5 -43
  636. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +7 -4
  637. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +2 -2
  638. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +22 -34
  639. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +2 -2
  640. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +16 -98
  641. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +1241 -657
  642. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +751 -398
  643. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +3551 -1938
  644. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +1272 -487
  645. metadata +103 -70
  646. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +0 -39
  647. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +0 -30
  648. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +0 -29
  649. data/src/core/lib/gprpp/global_config.h +0 -93
  650. data/src/core/lib/gprpp/global_config_env.cc +0 -140
  651. data/src/core/lib/gprpp/global_config_env.h +0 -133
  652. data/src/core/lib/gprpp/global_config_generic.h +0 -40
  653. data/src/core/lib/promise/intra_activity_waiter.h +0 -55
  654. data/src/core/lib/security/security_connector/ssl_utils_config.cc +0 -32
  655. data/src/core/lib/security/security_connector/ssl_utils_config.h +0 -29
  656. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +0 -195
  657. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +0 -83
  658. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +0 -236
  659. data/third_party/boringssl-with-bazel/src/crypto/asn1/charmap.h +0 -15
  660. data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +0 -206
  661. data/third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c +0 -38
  662. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1-altivec.c +0 -361
  663. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +0 -287
  664. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +0 -132
  665. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +0 -155
  666. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +0 -131
  667. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +0 -189
  668. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +0 -843
  669. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +0 -289
  670. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c +0 -57
  671. /data/src/core/lib/gpr/{log_android.cc → android/log.cc} +0 -0
  672. /data/src/core/lib/gpr/{cpu_iphone.cc → iphone/cpu.cc} +0 -0
  673. /data/src/core/lib/gpr/{cpu_linux.cc → linux/cpu.cc} +0 -0
  674. /data/src/core/lib/gpr/{log_linux.cc → linux/log.cc} +0 -0
  675. /data/src/core/lib/gpr/{tmpfile_msys.cc → msys/tmpfile.cc} +0 -0
  676. /data/src/core/lib/gpr/{cpu_posix.cc → posix/cpu.cc} +0 -0
  677. /data/src/core/lib/gpr/{log_posix.cc → posix/log.cc} +0 -0
  678. /data/src/core/lib/gpr/{string_posix.cc → posix/string.cc} +0 -0
  679. /data/src/core/lib/gpr/{sync_posix.cc → posix/sync.cc} +0 -0
  680. /data/src/core/lib/gpr/{time_posix.cc → posix/time.cc} +0 -0
  681. /data/src/core/lib/gpr/{tmpfile_posix.cc → posix/tmpfile.cc} +0 -0
  682. /data/src/core/lib/gpr/{cpu_windows.cc → windows/cpu.cc} +0 -0
  683. /data/src/core/lib/gpr/{log_windows.cc → windows/log.cc} +0 -0
  684. /data/src/core/lib/gpr/{string_windows.cc → windows/string.cc} +0 -0
  685. /data/src/core/lib/gpr/{string_util_windows.cc → windows/string_util.cc} +0 -0
  686. /data/src/core/lib/gpr/{sync_windows.cc → windows/sync.cc} +0 -0
  687. /data/src/core/lib/gpr/{time_windows.cc → windows/time.cc} +0 -0
  688. /data/src/core/lib/gpr/{tmpfile_windows.cc → windows/tmpfile.cc} +0 -0
  689. /data/src/core/lib/gprpp/{env_linux.cc → linux/env.cc} +0 -0
  690. /data/src/core/lib/gprpp/{env_posix.cc → posix/env.cc} +0 -0
  691. /data/src/core/lib/gprpp/{stat_posix.cc → posix/stat.cc} +0 -0
  692. /data/src/core/lib/gprpp/{env_windows.cc → windows/env.cc} +0 -0
  693. /data/src/core/lib/gprpp/{stat_windows.cc → windows/stat.cc} +0 -0
@@ -56,771 +56,532 @@
56
56
 
57
57
  #include <openssl/x509.h>
58
58
 
59
+ #include <assert.h>
60
+ #include <ctype.h>
61
+ #include <limits.h>
59
62
  #include <string.h>
60
63
 
61
64
  #include <openssl/asn1.h>
65
+ #include <openssl/bytestring.h>
62
66
  #include <openssl/err.h>
63
- #include <openssl/mem.h>
64
67
  #include <openssl/obj.h>
65
68
  #include <openssl/x509v3.h>
66
69
 
70
+ #include "../conf/internal.h"
67
71
  #include "../internal.h"
68
72
  #include "../x509v3/internal.h"
69
73
  #include "internal.h"
70
74
 
71
- /*
72
- * Although this file is in crypto/x509 for layering purposes, it emits
73
- * errors from the ASN.1 module for OpenSSL compatibility.
74
- */
75
-
76
- #define ASN1_GEN_FLAG 0x10000
77
- #define ASN1_GEN_FLAG_IMP (ASN1_GEN_FLAG|1)
78
- #define ASN1_GEN_FLAG_EXP (ASN1_GEN_FLAG|2)
79
- #define ASN1_GEN_FLAG_TAG (ASN1_GEN_FLAG|3)
80
- #define ASN1_GEN_FLAG_BITWRAP (ASN1_GEN_FLAG|4)
81
- #define ASN1_GEN_FLAG_OCTWRAP (ASN1_GEN_FLAG|5)
82
- #define ASN1_GEN_FLAG_SEQWRAP (ASN1_GEN_FLAG|6)
83
- #define ASN1_GEN_FLAG_SETWRAP (ASN1_GEN_FLAG|7)
84
- #define ASN1_GEN_FLAG_FORMAT (ASN1_GEN_FLAG|8)
85
-
86
- #define ASN1_GEN_STR(str,val) {str, sizeof(str) - 1, val}
87
-
88
- #define ASN1_FLAG_EXP_MAX 20
89
- /* Maximum number of nested sequences */
90
- #define ASN1_GEN_SEQ_MAX_DEPTH 50
91
-
92
- /* Input formats */
93
-
94
- /* ASCII: default */
95
- #define ASN1_GEN_FORMAT_ASCII 1
96
- /* UTF8 */
97
- #define ASN1_GEN_FORMAT_UTF8 2
98
- /* Hex */
99
- #define ASN1_GEN_FORMAT_HEX 3
100
- /* List of bits */
101
- #define ASN1_GEN_FORMAT_BITLIST 4
102
75
 
103
- struct tag_name_st {
104
- const char *strnam;
105
- int len;
106
- int tag;
107
- };
108
-
109
- typedef struct {
110
- int exp_tag;
111
- int exp_class;
112
- int exp_constructed;
113
- int exp_pad;
114
- long exp_len;
115
- } tag_exp_type;
116
-
117
- typedef struct {
118
- int imp_tag;
119
- int imp_class;
120
- int utype;
121
- int format;
122
- const char *str;
123
- tag_exp_type exp_list[ASN1_FLAG_EXP_MAX];
124
- int exp_count;
125
- } tag_exp_arg;
126
-
127
- static ASN1_TYPE *generate_v3(const char *str, X509V3_CTX *cnf, int depth,
128
- int *perr);
129
- static int bitstr_cb(const char *elem, int len, void *bitstr);
130
- static int asn1_cb(const char *elem, int len, void *bitstr);
131
- static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class,
132
- int exp_constructed, int exp_pad, int imp_ok);
133
- static int parse_tagging(const char *vstart, int vlen, int *ptag,
134
- int *pclass);
135
- static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf,
136
- int depth, int *perr);
137
- static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype);
138
- static int asn1_str2tag(const char *tagstr, int len);
139
-
140
- ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf)
141
- {
142
- int err = 0;
143
- ASN1_TYPE *ret = generate_v3(str, cnf, 0, &err);
144
- if (err)
145
- OPENSSL_PUT_ERROR(ASN1, err);
146
- return ret;
147
- }
76
+ // Although this file is in crypto/x509 for layering purposes, it emits
77
+ // errors from the ASN.1 module for OpenSSL compatibility.
148
78
 
149
- static ASN1_TYPE *generate_v3(const char *str, X509V3_CTX *cnf, int depth,
150
- int *perr)
151
- {
152
- ASN1_TYPE *ret;
153
- tag_exp_arg asn1_tags;
154
- tag_exp_type *etmp;
155
-
156
- int i, len;
157
-
158
- unsigned char *orig_der = NULL, *new_der = NULL;
159
- const unsigned char *cpy_start;
160
- unsigned char *p;
161
- const unsigned char *cp;
162
- int cpy_len;
163
- long hdr_len = 0;
164
- int hdr_constructed = 0, hdr_tag, hdr_class;
165
- int r;
166
-
167
- asn1_tags.imp_tag = -1;
168
- asn1_tags.imp_class = -1;
169
- asn1_tags.format = ASN1_GEN_FORMAT_ASCII;
170
- asn1_tags.exp_count = 0;
171
- if (CONF_parse_list(str, ',', 1, asn1_cb, &asn1_tags) != 0) {
172
- *perr = ASN1_R_UNKNOWN_TAG;
173
- return NULL;
174
- }
79
+ // ASN1_GEN_MAX_DEPTH is the maximum number of nested TLVs allowed.
80
+ #define ASN1_GEN_MAX_DEPTH 50
175
81
 
176
- if ((asn1_tags.utype == V_ASN1_SEQUENCE)
177
- || (asn1_tags.utype == V_ASN1_SET)) {
178
- if (!cnf) {
179
- *perr = ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG;
180
- return NULL;
181
- }
182
- if (depth >= ASN1_GEN_SEQ_MAX_DEPTH) {
183
- *perr = ASN1_R_ILLEGAL_NESTED_TAGGING;
184
- return NULL;
185
- }
186
- ret = asn1_multi(asn1_tags.utype, asn1_tags.str, cnf, depth, perr);
187
- } else
188
- ret = asn1_str2type(asn1_tags.str, asn1_tags.format, asn1_tags.utype);
189
-
190
- if (!ret)
191
- return NULL;
192
-
193
- /* If no tagging return base type */
194
- if ((asn1_tags.imp_tag == -1) && (asn1_tags.exp_count == 0))
195
- return ret;
196
-
197
- /* Generate the encoding */
198
- cpy_len = i2d_ASN1_TYPE(ret, &orig_der);
199
- ASN1_TYPE_free(ret);
200
- ret = NULL;
201
- /* Set point to start copying for modified encoding */
202
- cpy_start = orig_der;
203
-
204
- /* Do we need IMPLICIT tagging? */
205
- if (asn1_tags.imp_tag != -1) {
206
- /* If IMPLICIT we will replace the underlying tag */
207
- /* Skip existing tag+len */
208
- r = ASN1_get_object(&cpy_start, &hdr_len, &hdr_tag, &hdr_class,
209
- cpy_len);
210
- if (r & 0x80)
211
- goto err;
212
- /* Update copy length */
213
- cpy_len -= cpy_start - orig_der;
214
- /*
215
- * For IMPLICIT tagging the length should match the original length
216
- * and constructed flag should be consistent.
217
- */
218
- hdr_constructed = r & V_ASN1_CONSTRUCTED;
219
- /*
220
- * Work out new length with IMPLICIT tag: ignore constructed because
221
- * it will mess up if indefinite length
222
- */
223
- len = ASN1_object_size(0, hdr_len, asn1_tags.imp_tag);
224
- } else
225
- len = cpy_len;
226
-
227
- /* Work out length in any EXPLICIT, starting from end */
228
-
229
- for (i = 0, etmp = asn1_tags.exp_list + asn1_tags.exp_count - 1;
230
- i < asn1_tags.exp_count; i++, etmp--) {
231
- /* Content length: number of content octets + any padding */
232
- len += etmp->exp_pad;
233
- etmp->exp_len = len;
234
- /* Total object length: length including new header */
235
- len = ASN1_object_size(0, len, etmp->exp_tag);
236
- }
237
-
238
- /* Allocate buffer for new encoding */
82
+ // ASN1_GEN_MAX_OUTPUT is the maximum output, in bytes, allowed. This limit is
83
+ // necessary because the SEQUENCE and SET section reference mechanism allows the
84
+ // output length to grow super-linearly with the input length.
85
+ #define ASN1_GEN_MAX_OUTPUT (64 * 1024)
239
86
 
240
- new_der = OPENSSL_malloc(len);
241
- if (!new_der)
242
- goto err;
87
+ // ASN1_GEN_FORMAT_* are the values for the format modifiers.
88
+ #define ASN1_GEN_FORMAT_ASCII 1
89
+ #define ASN1_GEN_FORMAT_UTF8 2
90
+ #define ASN1_GEN_FORMAT_HEX 3
91
+ #define ASN1_GEN_FORMAT_BITLIST 4
243
92
 
244
- /* Generate tagged encoding */
93
+ // generate_v3 converts |str| into an ASN.1 structure and writes the result to
94
+ // |cbb|. It returns one on success and zero on error. |depth| bounds recursion,
95
+ // and |format| specifies the current format modifier.
96
+ //
97
+ // If |tag| is non-zero, the structure is implicitly tagged with |tag|. |tag|
98
+ // must not have the constructed bit set.
99
+ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf,
100
+ CBS_ASN1_TAG tag, int format, int depth);
101
+
102
+ static int bitstr_cb(const char *elem, size_t len, void *bitstr);
103
+
104
+ ASN1_TYPE *ASN1_generate_v3(const char *str, const X509V3_CTX *cnf) {
105
+ CBB cbb;
106
+ if (!CBB_init(&cbb, 0) || //
107
+ !generate_v3(&cbb, str, cnf, /*tag=*/0, ASN1_GEN_FORMAT_ASCII,
108
+ /*depth=*/0)) {
109
+ CBB_cleanup(&cbb);
110
+ return NULL;
111
+ }
112
+
113
+ // While not strictly necessary to avoid a DoS (we rely on any super-linear
114
+ // checks being performed internally), cap the overall output to
115
+ // |ASN1_GEN_MAX_OUTPUT| so the externally-visible behavior is consistent.
116
+ if (CBB_len(&cbb) > ASN1_GEN_MAX_OUTPUT) {
117
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG);
118
+ CBB_cleanup(&cbb);
119
+ return NULL;
120
+ }
245
121
 
246
- p = new_der;
122
+ const uint8_t *der = CBB_data(&cbb);
123
+ ASN1_TYPE *ret = d2i_ASN1_TYPE(NULL, &der, CBB_len(&cbb));
124
+ CBB_cleanup(&cbb);
125
+ return ret;
126
+ }
247
127
 
248
- /* Output explicit tags first */
128
+ static int cbs_str_equal(const CBS *cbs, const char *str) {
129
+ return CBS_len(cbs) == strlen(str) &&
130
+ OPENSSL_memcmp(CBS_data(cbs), str, strlen(str)) == 0;
131
+ }
249
132
 
250
- for (i = 0, etmp = asn1_tags.exp_list; i < asn1_tags.exp_count;
251
- i++, etmp++) {
252
- ASN1_put_object(&p, etmp->exp_constructed, etmp->exp_len,
253
- etmp->exp_tag, etmp->exp_class);
254
- if (etmp->exp_pad)
255
- *p++ = 0;
133
+ // parse_tag decodes a tag specifier in |cbs|. It returns the tag on success or
134
+ // zero on error.
135
+ static CBS_ASN1_TAG parse_tag(const CBS *cbs) {
136
+ CBS copy = *cbs;
137
+ uint64_t num;
138
+ if (!CBS_get_u64_decimal(&copy, &num) ||
139
+ num > CBS_ASN1_TAG_NUMBER_MASK) {
140
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER);
141
+ return 0;
142
+ }
143
+
144
+ CBS_ASN1_TAG tag_class = CBS_ASN1_CONTEXT_SPECIFIC;
145
+ // The tag may be suffixed by a class.
146
+ uint8_t c;
147
+ if (CBS_get_u8(&copy, &c)) {
148
+ switch (c) {
149
+ case 'U':
150
+ tag_class = CBS_ASN1_UNIVERSAL;
151
+ break;
152
+ case 'A':
153
+ tag_class = CBS_ASN1_APPLICATION;
154
+ break;
155
+ case 'P':
156
+ tag_class = CBS_ASN1_PRIVATE;
157
+ break;
158
+ case 'C':
159
+ tag_class = CBS_ASN1_CONTEXT_SPECIFIC;
160
+ break;
161
+ default: {
162
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_MODIFIER);
163
+ return 0;
164
+ }
256
165
  }
257
-
258
- /* If IMPLICIT, output tag */
259
-
260
- if (asn1_tags.imp_tag != -1) {
261
- if (asn1_tags.imp_class == V_ASN1_UNIVERSAL
262
- && (asn1_tags.imp_tag == V_ASN1_SEQUENCE
263
- || asn1_tags.imp_tag == V_ASN1_SET))
264
- hdr_constructed = V_ASN1_CONSTRUCTED;
265
- ASN1_put_object(&p, hdr_constructed, hdr_len,
266
- asn1_tags.imp_tag, asn1_tags.imp_class);
166
+ if (CBS_len(&copy) != 0) {
167
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_MODIFIER);
168
+ return 0;
267
169
  }
170
+ }
268
171
 
269
- /* Copy across original encoding */
270
- OPENSSL_memcpy(p, cpy_start, cpy_len);
271
-
272
- cp = new_der;
273
-
274
- /* Obtain new ASN1_TYPE structure */
275
- ret = d2i_ASN1_TYPE(NULL, &cp, len);
172
+ // Tag [UNIVERSAL 0] is reserved for indefinite-length end-of-contents. We
173
+ // also use zero in this file to indicator no explicit tagging.
174
+ if (tag_class == CBS_ASN1_UNIVERSAL && num == 0) {
175
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER);
176
+ return 0;
177
+ }
276
178
 
277
- err:
278
- if (orig_der)
279
- OPENSSL_free(orig_der);
280
- if (new_der)
281
- OPENSSL_free(new_der);
282
-
283
- return ret;
179
+ return tag_class | (CBS_ASN1_TAG)num;
180
+ }
284
181
 
182
+ static int generate_wrapped(CBB *cbb, const char *str, const X509V3_CTX *cnf,
183
+ CBS_ASN1_TAG tag, int padding, int format,
184
+ int depth) {
185
+ CBB child;
186
+ return CBB_add_asn1(cbb, &child, tag) &&
187
+ (!padding || CBB_add_u8(&child, 0)) &&
188
+ generate_v3(&child, str, cnf, /*tag=*/0, format, depth + 1) &&
189
+ CBB_flush(cbb);
285
190
  }
286
191
 
287
- static int asn1_cb(const char *elem, int len, void *bitstr)
288
- {
289
- tag_exp_arg *arg = bitstr;
290
- int i;
291
- int utype;
292
- int vlen = 0;
293
- const char *p, *vstart = NULL;
294
-
295
- int tmp_tag, tmp_class;
296
-
297
- if (elem == NULL)
298
- return -1;
299
-
300
- for (i = 0, p = elem; i < len; p++, i++) {
301
- /* Look for the ':' in name value pairs */
302
- if (*p == ':') {
303
- vstart = p + 1;
304
- vlen = len - (vstart - elem);
305
- len = p - elem;
306
- break;
307
- }
192
+ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf,
193
+ CBS_ASN1_TAG tag, int format, int depth) {
194
+ assert((tag & CBS_ASN1_CONSTRUCTED) == 0);
195
+ if (depth > ASN1_GEN_MAX_DEPTH) {
196
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING);
197
+ return 0;
198
+ }
199
+
200
+ // Process modifiers. This function uses a mix of NUL-terminated strings and
201
+ // |CBS|. Several functions only work with NUL-terminated strings, so we need
202
+ // to keep track of when a slice spans the whole buffer.
203
+ for (;;) {
204
+ // Skip whitespace.
205
+ while (*str != '\0' && OPENSSL_isspace((unsigned char)*str)) {
206
+ str++;
308
207
  }
309
208
 
310
- utype = asn1_str2tag(elem, len);
311
-
312
- if (utype == -1) {
313
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_TAG);
314
- ERR_add_error_data(2, "tag=", elem);
315
- return -1;
209
+ // Modifiers end at commas.
210
+ const char *comma = strchr(str, ',');
211
+ if (comma == NULL) {
212
+ break;
316
213
  }
317
214
 
318
- /* If this is not a modifier mark end of string and exit */
319
- if (!(utype & ASN1_GEN_FLAG)) {
320
- arg->utype = utype;
321
- arg->str = vstart;
322
- /* If no value and not end of string, error */
323
- if (!vstart && elem[len]) {
324
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
325
- return -1;
326
- }
327
- return 0;
328
- }
329
-
330
- switch (utype) {
331
-
332
- case ASN1_GEN_FLAG_IMP:
333
- /* Check for illegal multiple IMPLICIT tagging */
334
- if (arg->imp_tag != -1) {
335
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING);
336
- return -1;
337
- }
338
- if (!parse_tagging(vstart, vlen, &arg->imp_tag, &arg->imp_class))
339
- return -1;
340
- break;
341
-
342
- case ASN1_GEN_FLAG_EXP:
343
-
344
- if (!parse_tagging(vstart, vlen, &tmp_tag, &tmp_class))
345
- return -1;
346
- if (!append_exp(arg, tmp_tag, tmp_class, 1, 0, 0))
347
- return -1;
348
- break;
349
-
350
- case ASN1_GEN_FLAG_SEQWRAP:
351
- if (!append_exp(arg, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL, 1, 0, 1))
352
- return -1;
353
- break;
354
-
355
- case ASN1_GEN_FLAG_SETWRAP:
356
- if (!append_exp(arg, V_ASN1_SET, V_ASN1_UNIVERSAL, 1, 0, 1))
357
- return -1;
358
- break;
359
-
360
- case ASN1_GEN_FLAG_BITWRAP:
361
- if (!append_exp(arg, V_ASN1_BIT_STRING, V_ASN1_UNIVERSAL, 0, 1, 1))
362
- return -1;
363
- break;
364
-
365
- case ASN1_GEN_FLAG_OCTWRAP:
366
- if (!append_exp(arg, V_ASN1_OCTET_STRING, V_ASN1_UNIVERSAL, 0, 0, 1))
367
- return -1;
368
- break;
369
-
370
- case ASN1_GEN_FLAG_FORMAT:
371
- if (!vstart) {
372
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
373
- return -1;
374
- }
375
- if (!strncmp(vstart, "ASCII", 5))
376
- arg->format = ASN1_GEN_FORMAT_ASCII;
377
- else if (!strncmp(vstart, "UTF8", 4))
378
- arg->format = ASN1_GEN_FORMAT_UTF8;
379
- else if (!strncmp(vstart, "HEX", 3))
380
- arg->format = ASN1_GEN_FORMAT_HEX;
381
- else if (!strncmp(vstart, "BITLIST", 7))
382
- arg->format = ASN1_GEN_FORMAT_BITLIST;
383
- else {
384
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
385
- return -1;
386
- }
215
+ // Remove trailing whitespace.
216
+ CBS modifier;
217
+ CBS_init(&modifier, (const uint8_t *)str, comma - str);
218
+ for (;;) {
219
+ uint8_t v;
220
+ CBS copy = modifier;
221
+ if (!CBS_get_last_u8(&copy, &v) || !OPENSSL_isspace(v)) {
387
222
  break;
388
-
223
+ }
224
+ modifier = copy;
389
225
  }
390
226
 
391
- return 1;
227
+ // Advance the string past the modifier, but save the original value. We
228
+ // will need to rewind if this is not a recognized modifier.
229
+ const char *str_old = str;
230
+ str = comma + 1;
392
231
 
393
- }
232
+ // Each modifier is either NAME:VALUE or NAME.
233
+ CBS name;
234
+ int has_value = CBS_get_until_first(&modifier, &name, ':');
235
+ if (has_value) {
236
+ CBS_skip(&modifier, 1); // Skip the colon.
237
+ } else {
238
+ name = modifier;
239
+ CBS_init(&modifier, NULL, 0);
240
+ }
394
241
 
395
- static int parse_tagging(const char *vstart, int vlen, int *ptag, int *pclass)
396
- {
397
- char erch[2];
398
- long tag_num;
399
- char *eptr;
400
- if (!vstart)
242
+ if (cbs_str_equal(&name, "FORMAT") || cbs_str_equal(&name, "FORM")) {
243
+ if (cbs_str_equal(&modifier, "ASCII")) {
244
+ format = ASN1_GEN_FORMAT_ASCII;
245
+ } else if (cbs_str_equal(&modifier, "UTF8")) {
246
+ format = ASN1_GEN_FORMAT_UTF8;
247
+ } else if (cbs_str_equal(&modifier, "HEX")) {
248
+ format = ASN1_GEN_FORMAT_HEX;
249
+ } else if (cbs_str_equal(&modifier, "BITLIST")) {
250
+ format = ASN1_GEN_FORMAT_BITLIST;
251
+ } else {
252
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
253
+ return 0;
254
+ }
255
+ } else if (cbs_str_equal(&name, "IMP") ||
256
+ cbs_str_equal(&name, "IMPLICIT")) {
257
+ if (tag != 0) {
258
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING);
401
259
  return 0;
402
- tag_num = strtoul(vstart, &eptr, 10);
403
- /* Check we haven't gone past max length: should be impossible */
404
- if (eptr && *eptr && (eptr > vstart + vlen))
260
+ }
261
+ tag = parse_tag(&modifier);
262
+ if (tag == 0) {
405
263
  return 0;
406
- if (tag_num < 0) {
407
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER);
264
+ }
265
+ } else if (cbs_str_equal(&name, "EXP") ||
266
+ cbs_str_equal(&name, "EXPLICIT")) {
267
+ // It would actually be supportable, but OpenSSL does not allow wrapping
268
+ // an explicit tag in an implicit tag.
269
+ if (tag != 0) {
270
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING);
408
271
  return 0;
272
+ }
273
+ tag = parse_tag(&modifier);
274
+ return tag != 0 &&
275
+ generate_wrapped(cbb, str, cnf, tag | CBS_ASN1_CONSTRUCTED,
276
+ /*padding=*/0, format, depth);
277
+ } else if (cbs_str_equal(&name, "OCTWRAP")) {
278
+ tag = tag == 0 ? CBS_ASN1_OCTETSTRING : tag;
279
+ return generate_wrapped(cbb, str, cnf, tag, /*padding=*/0, format, depth);
280
+ } else if (cbs_str_equal(&name, "BITWRAP")) {
281
+ tag = tag == 0 ? CBS_ASN1_BITSTRING : tag;
282
+ return generate_wrapped(cbb, str, cnf, tag, /*padding=*/1, format, depth);
283
+ } else if (cbs_str_equal(&name, "SEQWRAP")) {
284
+ tag = tag == 0 ? CBS_ASN1_SEQUENCE : (tag | CBS_ASN1_CONSTRUCTED);
285
+ tag |= CBS_ASN1_CONSTRUCTED;
286
+ return generate_wrapped(cbb, str, cnf, tag, /*padding=*/0, format, depth);
287
+ } else if (cbs_str_equal(&name, "SETWRAP")) {
288
+ tag = tag == 0 ? CBS_ASN1_SET : (tag | CBS_ASN1_CONSTRUCTED);
289
+ return generate_wrapped(cbb, str, cnf, tag, /*padding=*/0, format, depth);
290
+ } else {
291
+ // If this was not a recognized modifier, rewind |str| to before splitting
292
+ // on the comma. The type itself consumes all remaining input.
293
+ str = str_old;
294
+ break;
409
295
  }
410
- *ptag = tag_num;
411
- /* If we have non numeric characters, parse them */
412
- if (eptr)
413
- vlen -= eptr - vstart;
414
- else
415
- vlen = 0;
416
- if (vlen) {
417
- switch (*eptr) {
418
-
419
- case 'U':
420
- *pclass = V_ASN1_UNIVERSAL;
421
- break;
422
-
423
- case 'A':
424
- *pclass = V_ASN1_APPLICATION;
425
- break;
426
-
427
- case 'P':
428
- *pclass = V_ASN1_PRIVATE;
429
- break;
430
-
431
- case 'C':
432
- *pclass = V_ASN1_CONTEXT_SPECIFIC;
433
- break;
434
-
435
- default:
436
- erch[0] = *eptr;
437
- erch[1] = 0;
438
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_MODIFIER);
439
- ERR_add_error_data(2, "Char=", erch);
440
- return 0;
441
- break;
442
-
443
- }
444
- } else
445
- *pclass = V_ASN1_CONTEXT_SPECIFIC;
446
-
447
- return 1;
448
-
449
- }
450
-
451
- /* Handle multiple types: SET and SEQUENCE */
452
-
453
- static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf,
454
- int depth, int *perr)
455
- {
456
- ASN1_TYPE *ret = NULL;
457
- STACK_OF(ASN1_TYPE) *sk = NULL;
458
- STACK_OF(CONF_VALUE) *sect = NULL;
459
- unsigned char *der = NULL;
460
- int derlen;
461
- size_t i;
462
- sk = sk_ASN1_TYPE_new_null();
463
- if (!sk)
464
- goto bad;
465
- if (section) {
466
- if (!cnf)
467
- goto bad;
468
- sect = X509V3_get_section(cnf, (char *)section);
469
- if (!sect)
470
- goto bad;
471
- for (i = 0; i < sk_CONF_VALUE_num(sect); i++) {
472
- ASN1_TYPE *typ =
473
- generate_v3(sk_CONF_VALUE_value(sect, i)->value, cnf,
474
- depth + 1, perr);
475
- if (!typ)
476
- goto bad;
477
- if (!sk_ASN1_TYPE_push(sk, typ))
478
- goto bad;
479
- }
296
+ }
297
+
298
+ // The final element is, like modifiers, NAME:VALUE or NAME, but VALUE spans
299
+ // the length of the string, including any commas.
300
+ const char *colon = strchr(str, ':');
301
+ CBS name;
302
+ const char *value;
303
+ int has_value = colon != NULL;
304
+ if (has_value) {
305
+ CBS_init(&name, (const uint8_t *)str, colon - str);
306
+ value = colon + 1;
307
+ } else {
308
+ CBS_init(&name, (const uint8_t *)str, strlen(str));
309
+ value = ""; // Most types treat missing and empty value equivalently.
310
+ }
311
+
312
+ static const struct {
313
+ const char *name;
314
+ CBS_ASN1_TAG type;
315
+ } kTypes[] = {
316
+ {"BOOL", CBS_ASN1_BOOLEAN},
317
+ {"BOOLEAN", CBS_ASN1_BOOLEAN},
318
+ {"NULL", CBS_ASN1_NULL},
319
+ {"INT", CBS_ASN1_INTEGER},
320
+ {"INTEGER", CBS_ASN1_INTEGER},
321
+ {"ENUM", CBS_ASN1_ENUMERATED},
322
+ {"ENUMERATED", CBS_ASN1_ENUMERATED},
323
+ {"OID", CBS_ASN1_OBJECT},
324
+ {"OBJECT", CBS_ASN1_OBJECT},
325
+ {"UTCTIME", CBS_ASN1_UTCTIME},
326
+ {"UTC", CBS_ASN1_UTCTIME},
327
+ {"GENERALIZEDTIME", CBS_ASN1_GENERALIZEDTIME},
328
+ {"GENTIME", CBS_ASN1_GENERALIZEDTIME},
329
+ {"OCT", CBS_ASN1_OCTETSTRING},
330
+ {"OCTETSTRING", CBS_ASN1_OCTETSTRING},
331
+ {"BITSTR", CBS_ASN1_BITSTRING},
332
+ {"BITSTRING", CBS_ASN1_BITSTRING},
333
+ {"UNIVERSALSTRING", CBS_ASN1_UNIVERSALSTRING},
334
+ {"UNIV", CBS_ASN1_UNIVERSALSTRING},
335
+ {"IA5", CBS_ASN1_IA5STRING},
336
+ {"IA5STRING", CBS_ASN1_IA5STRING},
337
+ {"UTF8", CBS_ASN1_UTF8STRING},
338
+ {"UTF8String", CBS_ASN1_UTF8STRING},
339
+ {"BMP", CBS_ASN1_BMPSTRING},
340
+ {"BMPSTRING", CBS_ASN1_BMPSTRING},
341
+ {"PRINTABLESTRING", CBS_ASN1_PRINTABLESTRING},
342
+ {"PRINTABLE", CBS_ASN1_PRINTABLESTRING},
343
+ {"T61", CBS_ASN1_T61STRING},
344
+ {"T61STRING", CBS_ASN1_T61STRING},
345
+ {"TELETEXSTRING", CBS_ASN1_T61STRING},
346
+ {"SEQUENCE", CBS_ASN1_SEQUENCE},
347
+ {"SEQ", CBS_ASN1_SEQUENCE},
348
+ {"SET", CBS_ASN1_SET},
349
+ };
350
+ CBS_ASN1_TAG type = 0;
351
+ for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTypes); i++) {
352
+ if (cbs_str_equal(&name, kTypes[i].name)) {
353
+ type = kTypes[i].type;
354
+ break;
480
355
  }
356
+ }
357
+ if (type == 0) {
358
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_TAG);
359
+ return 0;
360
+ }
361
+
362
+ // If there is an implicit tag, use the constructed bit from the base type.
363
+ tag = tag == 0 ? type : (tag | (type & CBS_ASN1_CONSTRUCTED));
364
+ CBB child;
365
+ if (!CBB_add_asn1(cbb, &child, tag)) {
366
+ return 0;
367
+ }
368
+
369
+ switch (type) {
370
+ case CBS_ASN1_NULL:
371
+ if (*value != '\0') {
372
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NULL_VALUE);
373
+ return 0;
374
+ }
375
+ return CBB_flush(cbb);
481
376
 
482
- /*
483
- * Now we has a STACK of the components, convert to the correct form
484
- */
485
-
486
- if (utype == V_ASN1_SET)
487
- derlen = i2d_ASN1_SET_ANY(sk, &der);
488
- else
489
- derlen = i2d_ASN1_SEQUENCE_ANY(sk, &der);
490
-
491
- if (derlen < 0)
492
- goto bad;
493
-
494
- if (!(ret = ASN1_TYPE_new()))
495
- goto bad;
496
-
497
- if (!(ret->value.asn1_string = ASN1_STRING_type_new(utype)))
498
- goto bad;
499
-
500
- ret->type = utype;
501
-
502
- ret->value.asn1_string->data = der;
503
- ret->value.asn1_string->length = derlen;
504
-
505
- der = NULL;
506
-
507
- bad:
508
-
509
- if (der)
510
- OPENSSL_free(der);
511
-
512
- if (sk)
513
- sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free);
514
- if (sect)
515
- X509V3_section_free(cnf, sect);
516
-
517
- return ret;
518
- }
519
-
520
- static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class,
521
- int exp_constructed, int exp_pad, int imp_ok)
522
- {
523
- tag_exp_type *exp_tmp;
524
- /* Can only have IMPLICIT if permitted */
525
- if ((arg->imp_tag != -1) && !imp_ok) {
526
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_IMPLICIT_TAG);
377
+ case CBS_ASN1_BOOLEAN: {
378
+ if (format != ASN1_GEN_FORMAT_ASCII) {
379
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_NOT_ASCII_FORMAT);
380
+ return 0;
381
+ }
382
+ ASN1_BOOLEAN boolean;
383
+ if (!X509V3_bool_from_string(value, &boolean)) {
384
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BOOLEAN);
527
385
  return 0;
386
+ }
387
+ return CBB_add_u8(&child, boolean ? 0xff : 0x00) && CBB_flush(cbb);
528
388
  }
529
389
 
530
- if (arg->exp_count == ASN1_FLAG_EXP_MAX) {
531
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_DEPTH_EXCEEDED);
390
+ case CBS_ASN1_INTEGER:
391
+ case CBS_ASN1_ENUMERATED: {
392
+ if (format != ASN1_GEN_FORMAT_ASCII) {
393
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_INTEGER_NOT_ASCII_FORMAT);
532
394
  return 0;
395
+ }
396
+ ASN1_INTEGER *obj = s2i_ASN1_INTEGER(NULL, value);
397
+ if (obj == NULL) {
398
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_INTEGER);
399
+ return 0;
400
+ }
401
+ int len = i2c_ASN1_INTEGER(obj, NULL);
402
+ uint8_t *out;
403
+ int ok = len > 0 && //
404
+ CBB_add_space(&child, &out, len) &&
405
+ i2c_ASN1_INTEGER(obj, &out) == len &&
406
+ CBB_flush(cbb);
407
+ ASN1_INTEGER_free(obj);
408
+ return ok;
533
409
  }
534
410
 
535
- exp_tmp = &arg->exp_list[arg->exp_count++];
536
-
537
- /*
538
- * If IMPLICIT set tag to implicit value then reset implicit tag since it
539
- * has been used.
540
- */
541
- if (arg->imp_tag != -1) {
542
- exp_tmp->exp_tag = arg->imp_tag;
543
- exp_tmp->exp_class = arg->imp_class;
544
- arg->imp_tag = -1;
545
- arg->imp_class = -1;
546
- } else {
547
- exp_tmp->exp_tag = exp_tag;
548
- exp_tmp->exp_class = exp_class;
411
+ case CBS_ASN1_OBJECT: {
412
+ if (format != ASN1_GEN_FORMAT_ASCII) {
413
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_OBJECT_NOT_ASCII_FORMAT);
414
+ return 0;
415
+ }
416
+ ASN1_OBJECT *obj = OBJ_txt2obj(value, /*dont_search_names=*/0);
417
+ if (obj == NULL || obj->length == 0) {
418
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT);
419
+ return 0;
420
+ }
421
+ int ok = CBB_add_bytes(&child, obj->data, obj->length) && CBB_flush(cbb);
422
+ ASN1_OBJECT_free(obj);
423
+ return ok;
549
424
  }
550
- exp_tmp->exp_constructed = exp_constructed;
551
- exp_tmp->exp_pad = exp_pad;
552
425
 
553
- return 1;
554
- }
555
-
556
- static int asn1_str2tag(const char *tagstr, int len)
557
- {
558
- unsigned int i;
559
- static const struct tag_name_st *tntmp, tnst[] = {
560
- ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN),
561
- ASN1_GEN_STR("BOOLEAN", V_ASN1_BOOLEAN),
562
- ASN1_GEN_STR("NULL", V_ASN1_NULL),
563
- ASN1_GEN_STR("INT", V_ASN1_INTEGER),
564
- ASN1_GEN_STR("INTEGER", V_ASN1_INTEGER),
565
- ASN1_GEN_STR("ENUM", V_ASN1_ENUMERATED),
566
- ASN1_GEN_STR("ENUMERATED", V_ASN1_ENUMERATED),
567
- ASN1_GEN_STR("OID", V_ASN1_OBJECT),
568
- ASN1_GEN_STR("OBJECT", V_ASN1_OBJECT),
569
- ASN1_GEN_STR("UTCTIME", V_ASN1_UTCTIME),
570
- ASN1_GEN_STR("UTC", V_ASN1_UTCTIME),
571
- ASN1_GEN_STR("GENERALIZEDTIME", V_ASN1_GENERALIZEDTIME),
572
- ASN1_GEN_STR("GENTIME", V_ASN1_GENERALIZEDTIME),
573
- ASN1_GEN_STR("OCT", V_ASN1_OCTET_STRING),
574
- ASN1_GEN_STR("OCTETSTRING", V_ASN1_OCTET_STRING),
575
- ASN1_GEN_STR("BITSTR", V_ASN1_BIT_STRING),
576
- ASN1_GEN_STR("BITSTRING", V_ASN1_BIT_STRING),
577
- ASN1_GEN_STR("UNIVERSALSTRING", V_ASN1_UNIVERSALSTRING),
578
- ASN1_GEN_STR("UNIV", V_ASN1_UNIVERSALSTRING),
579
- ASN1_GEN_STR("IA5", V_ASN1_IA5STRING),
580
- ASN1_GEN_STR("IA5STRING", V_ASN1_IA5STRING),
581
- ASN1_GEN_STR("UTF8", V_ASN1_UTF8STRING),
582
- ASN1_GEN_STR("UTF8String", V_ASN1_UTF8STRING),
583
- ASN1_GEN_STR("BMP", V_ASN1_BMPSTRING),
584
- ASN1_GEN_STR("BMPSTRING", V_ASN1_BMPSTRING),
585
- ASN1_GEN_STR("VISIBLESTRING", V_ASN1_VISIBLESTRING),
586
- ASN1_GEN_STR("VISIBLE", V_ASN1_VISIBLESTRING),
587
- ASN1_GEN_STR("PRINTABLESTRING", V_ASN1_PRINTABLESTRING),
588
- ASN1_GEN_STR("PRINTABLE", V_ASN1_PRINTABLESTRING),
589
- ASN1_GEN_STR("T61", V_ASN1_T61STRING),
590
- ASN1_GEN_STR("T61STRING", V_ASN1_T61STRING),
591
- ASN1_GEN_STR("TELETEXSTRING", V_ASN1_T61STRING),
592
- ASN1_GEN_STR("GeneralString", V_ASN1_GENERALSTRING),
593
- ASN1_GEN_STR("GENSTR", V_ASN1_GENERALSTRING),
594
- ASN1_GEN_STR("NUMERIC", V_ASN1_NUMERICSTRING),
595
- ASN1_GEN_STR("NUMERICSTRING", V_ASN1_NUMERICSTRING),
596
-
597
- /* Special cases */
598
- ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE),
599
- ASN1_GEN_STR("SEQ", V_ASN1_SEQUENCE),
600
- ASN1_GEN_STR("SET", V_ASN1_SET),
601
- /* type modifiers */
602
- /* Explicit tag */
603
- ASN1_GEN_STR("EXP", ASN1_GEN_FLAG_EXP),
604
- ASN1_GEN_STR("EXPLICIT", ASN1_GEN_FLAG_EXP),
605
- /* Implicit tag */
606
- ASN1_GEN_STR("IMP", ASN1_GEN_FLAG_IMP),
607
- ASN1_GEN_STR("IMPLICIT", ASN1_GEN_FLAG_IMP),
608
- /* OCTET STRING wrapper */
609
- ASN1_GEN_STR("OCTWRAP", ASN1_GEN_FLAG_OCTWRAP),
610
- /* SEQUENCE wrapper */
611
- ASN1_GEN_STR("SEQWRAP", ASN1_GEN_FLAG_SEQWRAP),
612
- /* SET wrapper */
613
- ASN1_GEN_STR("SETWRAP", ASN1_GEN_FLAG_SETWRAP),
614
- /* BIT STRING wrapper */
615
- ASN1_GEN_STR("BITWRAP", ASN1_GEN_FLAG_BITWRAP),
616
- ASN1_GEN_STR("FORM", ASN1_GEN_FLAG_FORMAT),
617
- ASN1_GEN_STR("FORMAT", ASN1_GEN_FLAG_FORMAT),
618
- };
619
-
620
- if (len == -1)
621
- len = strlen(tagstr);
622
-
623
- tntmp = tnst;
624
- for (i = 0; i < sizeof(tnst) / sizeof(struct tag_name_st); i++, tntmp++) {
625
- if ((len == tntmp->len) && !strncmp(tntmp->strnam, tagstr, len))
626
- return tntmp->tag;
426
+ case CBS_ASN1_UTCTIME:
427
+ case CBS_ASN1_GENERALIZEDTIME: {
428
+ if (format != ASN1_GEN_FORMAT_ASCII) {
429
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_TIME_NOT_ASCII_FORMAT);
430
+ return 0;
431
+ }
432
+ CBS value_cbs;
433
+ CBS_init(&value_cbs, (const uint8_t*)value, strlen(value));
434
+ int ok = type == CBS_ASN1_UTCTIME
435
+ ? CBS_parse_utc_time(&value_cbs, NULL,
436
+ /*allow_timezone_offset=*/0)
437
+ : CBS_parse_generalized_time(&value_cbs, NULL,
438
+ /*allow_timezone_offset=*/0);
439
+ if (!ok) {
440
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TIME_VALUE);
441
+ return 0;
442
+ }
443
+ return CBB_add_bytes(&child, (const uint8_t *)value, strlen(value)) &&
444
+ CBB_flush(cbb);
627
445
  }
628
446
 
629
- return -1;
630
- }
631
-
632
- static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype)
633
- {
634
- ASN1_TYPE *atmp = NULL;
635
-
636
- CONF_VALUE vtmp;
637
-
638
- unsigned char *rdata;
639
- long rdlen;
640
-
641
- int no_unused = 1;
642
-
643
- if (!(atmp = ASN1_TYPE_new())) {
644
- OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
645
- return NULL;
447
+ case CBS_ASN1_UNIVERSALSTRING:
448
+ case CBS_ASN1_IA5STRING:
449
+ case CBS_ASN1_UTF8STRING:
450
+ case CBS_ASN1_BMPSTRING:
451
+ case CBS_ASN1_PRINTABLESTRING:
452
+ case CBS_ASN1_T61STRING: {
453
+ int encoding;
454
+ if (format == ASN1_GEN_FORMAT_ASCII) {
455
+ encoding = MBSTRING_ASC;
456
+ } else if (format == ASN1_GEN_FORMAT_UTF8) {
457
+ encoding = MBSTRING_UTF8;
458
+ } else {
459
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_FORMAT);
460
+ return 0;
461
+ }
462
+
463
+ // |maxsize| is measured in code points, rather than bytes, but pass it in
464
+ // as a loose cap so fuzzers can exit from excessively long inputs
465
+ // earlier. This limit is not load-bearing because |ASN1_mbstring_ncopy|'s
466
+ // output is already linear in the input.
467
+ ASN1_STRING *obj = NULL;
468
+ if (ASN1_mbstring_ncopy(&obj, (const uint8_t *)value, -1, encoding,
469
+ ASN1_tag2bit(type), /*minsize=*/0,
470
+ /*maxsize=*/ASN1_GEN_MAX_OUTPUT) <= 0) {
471
+ return 0;
472
+ }
473
+ int ok = CBB_add_bytes(&child, obj->data, obj->length) && CBB_flush(cbb);
474
+ ASN1_STRING_free(obj);
475
+ return ok;
646
476
  }
647
477
 
648
- if (!str)
649
- str = "";
650
-
651
- switch (utype) {
652
-
653
- case V_ASN1_NULL:
654
- if (str && *str) {
655
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NULL_VALUE);
656
- goto bad_form;
657
- }
658
- break;
659
-
660
- case V_ASN1_BOOLEAN:
661
- if (format != ASN1_GEN_FORMAT_ASCII) {
662
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_NOT_ASCII_FORMAT);
663
- goto bad_form;
664
- }
665
- vtmp.name = NULL;
666
- vtmp.section = NULL;
667
- vtmp.value = (char *)str;
668
- if (!X509V3_get_value_bool(&vtmp, &atmp->value.boolean)) {
669
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BOOLEAN);
670
- goto bad_str;
671
- }
672
- break;
673
-
674
- case V_ASN1_INTEGER:
675
- case V_ASN1_ENUMERATED:
676
- if (format != ASN1_GEN_FORMAT_ASCII) {
677
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_INTEGER_NOT_ASCII_FORMAT);
678
- goto bad_form;
679
- }
680
- if (!(atmp->value.integer = s2i_ASN1_INTEGER(NULL, (char *)str))) {
681
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_INTEGER);
682
- goto bad_str;
683
- }
684
- break;
685
-
686
- case V_ASN1_OBJECT:
687
- if (format != ASN1_GEN_FORMAT_ASCII) {
688
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_OBJECT_NOT_ASCII_FORMAT);
689
- goto bad_form;
690
- }
691
- if (!(atmp->value.object = OBJ_txt2obj(str, 0))) {
692
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT);
693
- goto bad_str;
694
- }
695
- break;
696
-
697
- case V_ASN1_UTCTIME:
698
- case V_ASN1_GENERALIZEDTIME:
699
- if (format != ASN1_GEN_FORMAT_ASCII) {
700
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_TIME_NOT_ASCII_FORMAT);
701
- goto bad_form;
702
- }
703
- if (!(atmp->value.asn1_string = ASN1_STRING_new())) {
704
- OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
705
- goto bad_str;
706
- }
707
- if (!ASN1_STRING_set(atmp->value.asn1_string, str, -1)) {
708
- OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
709
- goto bad_str;
478
+ case CBS_ASN1_BITSTRING:
479
+ if (format == ASN1_GEN_FORMAT_BITLIST) {
480
+ ASN1_BIT_STRING *obj = ASN1_BIT_STRING_new();
481
+ if (obj == NULL) {
482
+ return 0;
710
483
  }
711
- atmp->value.asn1_string->type = utype;
712
- if (!ASN1_TIME_check(atmp->value.asn1_string)) {
713
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TIME_VALUE);
714
- goto bad_str;
715
- }
716
-
717
- break;
718
-
719
- case V_ASN1_BMPSTRING:
720
- case V_ASN1_PRINTABLESTRING:
721
- case V_ASN1_IA5STRING:
722
- case V_ASN1_T61STRING:
723
- case V_ASN1_UTF8STRING:
724
- case V_ASN1_VISIBLESTRING:
725
- case V_ASN1_UNIVERSALSTRING:
726
- case V_ASN1_GENERALSTRING:
727
- case V_ASN1_NUMERICSTRING:
728
-
729
- if (format == ASN1_GEN_FORMAT_ASCII)
730
- format = MBSTRING_ASC;
731
- else if (format == ASN1_GEN_FORMAT_UTF8)
732
- format = MBSTRING_UTF8;
733
- else {
734
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_FORMAT);
735
- goto bad_form;
484
+ if (!CONF_parse_list(value, ',', 1, bitstr_cb, obj)) {
485
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_LIST_ERROR);
486
+ ASN1_BIT_STRING_free(obj);
487
+ return 0;
736
488
  }
737
-
738
- if (ASN1_mbstring_copy(&atmp->value.asn1_string, (unsigned char *)str,
739
- -1, format, ASN1_tag2bit(utype)) <= 0) {
740
- OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
741
- goto bad_str;
489
+ int len = i2c_ASN1_BIT_STRING(obj, NULL);
490
+ uint8_t *out;
491
+ int ok = len > 0 && //
492
+ CBB_add_space(&child, &out, len) &&
493
+ i2c_ASN1_BIT_STRING(obj, &out) == len && //
494
+ CBB_flush(cbb);
495
+ ASN1_BIT_STRING_free(obj);
496
+ return ok;
497
+ }
498
+
499
+ // The other formats are the same as OCTET STRING, but with the leading
500
+ // zero bytes.
501
+ if (!CBB_add_u8(&child, 0)) {
502
+ return 0;
503
+ }
504
+ OPENSSL_FALLTHROUGH;
505
+
506
+ case CBS_ASN1_OCTETSTRING:
507
+ if (format == ASN1_GEN_FORMAT_ASCII) {
508
+ return CBB_add_bytes(&child, (const uint8_t *)value, strlen(value)) &&
509
+ CBB_flush(cbb);
510
+ }
511
+ if (format == ASN1_GEN_FORMAT_HEX) {
512
+ long len;
513
+ uint8_t *data = x509v3_hex_to_bytes(value, &len);
514
+ if (data == NULL) {
515
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_HEX);
516
+ return 0;
742
517
  }
743
-
744
- break;
745
-
746
- case V_ASN1_BIT_STRING:
747
-
748
- case V_ASN1_OCTET_STRING:
749
-
750
- if (!(atmp->value.asn1_string = ASN1_STRING_new())) {
751
- OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
752
- goto bad_form;
518
+ int ok = CBB_add_bytes(&child, data, len) && CBB_flush(cbb);
519
+ OPENSSL_free(data);
520
+ return ok;
521
+ }
522
+
523
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BITSTRING_FORMAT);
524
+ return 0;
525
+
526
+ case CBS_ASN1_SEQUENCE:
527
+ case CBS_ASN1_SET:
528
+ if (has_value) {
529
+ if (cnf == NULL) {
530
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG);
531
+ return 0;
753
532
  }
754
-
755
- if (format == ASN1_GEN_FORMAT_HEX) {
756
-
757
- if (!(rdata = x509v3_hex_to_bytes((char *)str, &rdlen))) {
758
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_HEX);
759
- goto bad_str;
760
- }
761
-
762
- atmp->value.asn1_string->data = rdata;
763
- atmp->value.asn1_string->length = rdlen;
764
- atmp->value.asn1_string->type = utype;
765
-
766
- } else if (format == ASN1_GEN_FORMAT_ASCII)
767
- ASN1_STRING_set(atmp->value.asn1_string, str, -1);
768
- else if ((format == ASN1_GEN_FORMAT_BITLIST)
769
- && (utype == V_ASN1_BIT_STRING)) {
770
- if (!CONF_parse_list
771
- (str, ',', 1, bitstr_cb, atmp->value.bit_string)) {
772
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_LIST_ERROR);
773
- goto bad_str;
774
- }
775
- no_unused = 0;
776
-
777
- } else {
778
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BITSTRING_FORMAT);
779
- goto bad_form;
533
+ const STACK_OF(CONF_VALUE) *section = X509V3_get_section(cnf, value);
534
+ if (section == NULL) {
535
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG);
536
+ return 0;
780
537
  }
781
-
782
- if ((utype == V_ASN1_BIT_STRING) && no_unused) {
783
- atmp->value.asn1_string->flags
784
- &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
785
- atmp->value.asn1_string->flags |= ASN1_STRING_FLAG_BITS_LEFT;
538
+ for (size_t i = 0; i < sk_CONF_VALUE_num(section); i++) {
539
+ const CONF_VALUE *conf = sk_CONF_VALUE_value(section, i);
540
+ if (!generate_v3(&child, conf->value, cnf, /*tag=*/0,
541
+ ASN1_GEN_FORMAT_ASCII, depth + 1)) {
542
+ return 0;
543
+ }
544
+ // This recursive call, by referencing |section|, is the one place
545
+ // where |generate_v3|'s output can be super-linear in the input.
546
+ // Check bounds here.
547
+ if (CBB_len(&child) > ASN1_GEN_MAX_OUTPUT) {
548
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG);
549
+ return 0;
550
+ }
786
551
  }
787
-
788
- break;
552
+ }
553
+ if (type == CBS_ASN1_SET) {
554
+ // The SET type here is a SET OF and must be sorted.
555
+ return CBB_flush_asn1_set_of(&child) && CBB_flush(cbb);
556
+ }
557
+ return CBB_flush(cbb);
789
558
 
790
559
  default:
791
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_TYPE);
792
- goto bad_str;
793
- break;
794
- }
795
-
796
- atmp->type = utype;
797
- return atmp;
798
-
799
- bad_str:
800
- ERR_add_error_data(2, "string=", str);
801
- bad_form:
802
-
803
- ASN1_TYPE_free(atmp);
804
- return NULL;
805
-
560
+ OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR);
561
+ return 0;
562
+ }
806
563
  }
807
564
 
808
- static int bitstr_cb(const char *elem, int len, void *bitstr)
809
- {
810
- long bitnum;
811
- char *eptr;
812
- if (!elem)
813
- return 0;
814
- bitnum = strtoul(elem, &eptr, 10);
815
- if (eptr && *eptr && (eptr != elem + len))
816
- return 0;
817
- if (bitnum < 0) {
818
- OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER);
819
- return 0;
820
- }
821
- if (!ASN1_BIT_STRING_set_bit(bitstr, bitnum, 1)) {
822
- OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
823
- return 0;
824
- }
825
- return 1;
565
+ static int bitstr_cb(const char *elem, size_t len, void *bitstr) {
566
+ CBS cbs;
567
+ CBS_init(&cbs, (const uint8_t *)elem, len);
568
+ uint64_t bitnum;
569
+ if (!CBS_get_u64_decimal(&cbs, &bitnum) || CBS_len(&cbs) != 0 ||
570
+ // Cap the highest allowed bit so this mechanism cannot be used to create
571
+ // extremely large allocations with short inputs. The highest named bit in
572
+ // RFC 5280 is 8, so 256 should give comfortable margin but still only
573
+ // allow a 32-byte allocation.
574
+ //
575
+ // We do not consider this function to be safe with untrusted inputs (even
576
+ // without bugs, it is prone to string injection vulnerabilities), so DoS
577
+ // is not truly a concern, but the limit is necessary to keep fuzzing
578
+ // effective.
579
+ bitnum > 256) {
580
+ OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER);
581
+ return 0;
582
+ }
583
+ if (!ASN1_BIT_STRING_set_bit(bitstr, (int)bitnum, 1)) {
584
+ return 0;
585
+ }
586
+ return 1;
826
587
  }