grpc 1.53.1 → 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 (689) 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_listener.cc +6 -3
  137. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +27 -18
  138. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +0 -3
  139. data/src/core/lib/event_engine/resolved_address.cc +2 -1
  140. data/src/core/lib/event_engine/windows/win_socket.cc +0 -1
  141. data/src/core/lib/event_engine/windows/windows_endpoint.cc +129 -82
  142. data/src/core/lib/event_engine/windows/windows_endpoint.h +21 -5
  143. data/src/core/lib/event_engine/windows/windows_engine.cc +39 -18
  144. data/src/core/lib/event_engine/windows/windows_engine.h +2 -1
  145. data/src/core/lib/event_engine/windows/windows_listener.cc +370 -0
  146. data/src/core/lib/event_engine/windows/windows_listener.h +155 -0
  147. data/src/core/lib/experiments/config.cc +3 -10
  148. data/src/core/lib/experiments/experiments.cc +7 -0
  149. data/src/core/lib/experiments/experiments.h +9 -1
  150. data/src/core/lib/gpr/log.cc +15 -28
  151. data/src/core/lib/gprpp/fork.cc +8 -14
  152. data/src/core/lib/gprpp/orphanable.h +4 -3
  153. data/src/core/lib/gprpp/per_cpu.h +9 -3
  154. data/src/core/lib/gprpp/{thd_posix.cc → posix/thd.cc} +49 -37
  155. data/src/core/lib/gprpp/ref_counted.h +33 -34
  156. data/src/core/lib/gprpp/thd.h +16 -0
  157. data/src/core/lib/gprpp/time.cc +1 -0
  158. data/src/core/lib/gprpp/time.h +4 -4
  159. data/src/core/lib/gprpp/{thd_windows.cc → windows/thd.cc} +2 -2
  160. data/src/core/lib/iomgr/call_combiner.h +2 -2
  161. data/src/core/lib/iomgr/endpoint_cfstream.cc +4 -2
  162. data/src/core/lib/iomgr/ev_posix.cc +13 -53
  163. data/src/core/lib/iomgr/ev_posix.h +0 -3
  164. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +103 -76
  165. data/src/core/lib/iomgr/iomgr.cc +4 -8
  166. data/src/core/lib/iomgr/iomgr_windows.cc +8 -2
  167. data/src/core/lib/iomgr/pollset_set_windows.cc +9 -9
  168. data/src/core/lib/iomgr/pollset_windows.cc +1 -1
  169. data/src/core/lib/iomgr/socket_utils_common_posix.cc +16 -3
  170. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -2
  171. data/src/core/lib/iomgr/tcp_posix.cc +0 -1
  172. data/src/core/lib/iomgr/tcp_server_posix.cc +5 -16
  173. data/src/core/lib/iomgr/tcp_server_windows.cc +176 -9
  174. data/src/core/lib/iomgr/tcp_windows.cc +12 -8
  175. data/src/core/lib/load_balancing/lb_policy.cc +9 -13
  176. data/src/core/lib/load_balancing/lb_policy.h +4 -2
  177. data/src/core/lib/promise/activity.cc +22 -6
  178. data/src/core/lib/promise/activity.h +61 -24
  179. data/src/core/lib/promise/cancel_callback.h +77 -0
  180. data/src/core/lib/promise/detail/basic_seq.h +1 -1
  181. data/src/core/lib/promise/detail/promise_factory.h +4 -0
  182. data/src/core/lib/promise/for_each.h +176 -0
  183. data/src/core/lib/promise/if.h +9 -0
  184. data/src/core/lib/promise/interceptor_list.h +23 -2
  185. data/src/core/lib/promise/latch.h +89 -3
  186. data/src/core/lib/promise/loop.h +13 -9
  187. data/src/core/lib/promise/map.h +7 -0
  188. data/src/core/lib/promise/party.cc +286 -0
  189. data/src/core/lib/promise/party.h +499 -0
  190. data/src/core/lib/promise/pipe.h +197 -57
  191. data/src/core/lib/promise/poll.h +48 -0
  192. data/src/core/lib/promise/promise.h +2 -2
  193. data/src/core/lib/resource_quota/arena.cc +19 -3
  194. data/src/core/lib/resource_quota/arena.h +119 -5
  195. data/src/core/lib/resource_quota/memory_quota.cc +1 -1
  196. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +12 -35
  197. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -0
  198. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +0 -59
  199. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -5
  200. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  201. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +13 -0
  202. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +2 -0
  203. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +5 -9
  204. data/src/core/lib/security/security_connector/ssl_utils.cc +11 -25
  205. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +12 -0
  206. data/src/core/lib/security/transport/secure_endpoint.cc +4 -2
  207. data/src/core/lib/security/transport/server_auth_filter.cc +20 -2
  208. data/src/core/lib/slice/slice.cc +1 -1
  209. data/src/core/lib/surface/builtins.cc +2 -0
  210. data/src/core/lib/surface/call.cc +926 -1024
  211. data/src/core/lib/surface/call.h +10 -0
  212. data/src/core/lib/surface/lame_client.cc +1 -0
  213. data/src/core/lib/surface/validate_metadata.cc +42 -43
  214. data/src/core/lib/surface/validate_metadata.h +0 -9
  215. data/src/core/lib/surface/version.cc +2 -2
  216. data/src/core/lib/transport/batch_builder.cc +179 -0
  217. data/src/core/lib/transport/batch_builder.h +468 -0
  218. data/src/core/lib/transport/bdp_estimator.cc +7 -7
  219. data/src/core/lib/transport/bdp_estimator.h +10 -6
  220. data/src/core/lib/transport/custom_metadata.h +30 -0
  221. data/src/core/lib/transport/metadata_batch.cc +5 -2
  222. data/src/core/lib/transport/metadata_batch.h +17 -113
  223. data/src/core/lib/transport/parsed_metadata.h +6 -16
  224. data/src/core/lib/transport/timeout_encoding.cc +6 -1
  225. data/src/core/lib/transport/transport.cc +30 -2
  226. data/src/core/lib/transport/transport.h +70 -14
  227. data/src/core/lib/transport/transport_impl.h +7 -0
  228. data/src/core/lib/transport/transport_op_string.cc +52 -42
  229. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -2
  230. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +1 -0
  231. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +21 -4
  232. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +5 -0
  233. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  234. data/src/core/tsi/ssl_transport_security.cc +4 -2
  235. data/src/ruby/lib/grpc/version.rb +1 -1
  236. data/third_party/abseil-cpp/absl/base/config.h +1 -1
  237. data/third_party/abseil-cpp/absl/flags/commandlineflag.cc +34 -0
  238. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +200 -0
  239. data/third_party/abseil-cpp/absl/flags/config.h +68 -0
  240. data/third_party/abseil-cpp/absl/flags/declare.h +73 -0
  241. data/third_party/abseil-cpp/absl/flags/flag.cc +38 -0
  242. data/third_party/abseil-cpp/absl/flags/flag.h +310 -0
  243. data/{src/core/lib/gprpp/global_config_custom.h → third_party/abseil-cpp/absl/flags/internal/commandlineflag.cc} +11 -14
  244. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +68 -0
  245. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +615 -0
  246. data/third_party/abseil-cpp/absl/flags/internal/flag.h +800 -0
  247. data/third_party/abseil-cpp/absl/flags/internal/flag_msvc.inc +116 -0
  248. data/third_party/abseil-cpp/absl/flags/internal/path_util.h +62 -0
  249. data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.cc +65 -0
  250. data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.h +61 -0
  251. data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +60 -0
  252. data/third_party/abseil-cpp/absl/flags/internal/program_name.h +50 -0
  253. data/third_party/abseil-cpp/absl/flags/internal/registry.h +97 -0
  254. data/third_party/abseil-cpp/absl/flags/internal/sequence_lock.h +187 -0
  255. data/third_party/abseil-cpp/absl/flags/marshalling.cc +241 -0
  256. data/third_party/abseil-cpp/absl/flags/marshalling.h +356 -0
  257. data/third_party/abseil-cpp/absl/flags/reflection.cc +354 -0
  258. data/third_party/abseil-cpp/absl/flags/reflection.h +90 -0
  259. data/third_party/abseil-cpp/absl/flags/usage_config.cc +165 -0
  260. data/third_party/abseil-cpp/absl/flags/usage_config.h +135 -0
  261. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +12 -8
  262. data/third_party/boringssl-with-bazel/err_data.c +728 -712
  263. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +177 -177
  264. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +28 -55
  265. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +21 -23
  266. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c +20 -23
  267. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +66 -185
  268. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c +18 -21
  269. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +356 -311
  270. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +174 -194
  271. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +146 -210
  272. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +6 -9
  273. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.c +346 -526
  274. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +110 -131
  275. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +130 -116
  276. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +93 -60
  277. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +93 -181
  278. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +242 -305
  279. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +41 -18
  280. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +30 -33
  281. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +36 -33
  282. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +29 -26
  283. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +133 -88
  284. data/third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.c +230 -0
  285. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +791 -791
  286. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +526 -526
  287. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +114 -135
  288. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +201 -207
  289. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +21 -26
  290. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +55 -68
  291. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +2 -4
  292. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +11 -7
  293. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +4 -4
  294. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +15 -9
  295. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +4 -4
  296. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +17 -10
  297. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -3
  298. data/third_party/boringssl-with-bazel/src/crypto/bio/printf.c +0 -13
  299. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -6
  300. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +2 -0
  301. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +9 -5
  302. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c +10 -23
  303. data/third_party/boringssl-with-bazel/src/crypto/buf/buf.c +2 -6
  304. data/third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c +2 -1
  305. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +29 -28
  306. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +161 -201
  307. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +254 -39
  308. data/third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h +2 -2
  309. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +0 -2
  310. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +4 -4
  311. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c +9 -8
  312. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c +37 -75
  313. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +8 -10
  314. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/cipher → cipher_extra}/e_des.c +100 -78
  315. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c +1 -0
  316. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c +1 -0
  317. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c +2 -0
  318. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +6 -12
  319. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -11
  320. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +6 -10
  321. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -1
  322. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +12 -0
  323. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +74 -0
  324. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_freebsd.c +62 -0
  325. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-fuchsia.c → cpu_aarch64_fuchsia.c} +8 -7
  326. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-linux.c → cpu_aarch64_linux.c} +6 -4
  327. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-win.c → cpu_aarch64_win.c} +4 -4
  328. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm.c → cpu_arm.c} +1 -1
  329. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c +55 -0
  330. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm-linux.c → cpu_arm_linux.c} +11 -90
  331. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm-linux.h → cpu_arm_linux.h} +0 -38
  332. data/third_party/boringssl-with-bazel/src/crypto/{cpu-intel.c → cpu_intel.c} +1 -2
  333. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +25 -20
  334. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +16 -27
  335. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +17 -32
  336. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/des → des}/des.c +232 -232
  337. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/des → des}/internal.h +1 -1
  338. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c +1 -0
  339. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c +232 -29
  340. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +0 -3
  341. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +39 -16
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +37 -7
  343. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +3 -3
  344. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +11 -36
  345. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +214 -99
  346. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +21 -5
  347. data/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c +2 -4
  348. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +83 -60
  349. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +46 -12
  350. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +3 -3
  351. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c +25 -23
  352. data/third_party/boringssl-with-bazel/src/crypto/evp/internal.h +43 -9
  353. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +75 -44
  354. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +19 -25
  355. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c +96 -45
  356. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c +7 -8
  357. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c +26 -23
  358. data/third_party/boringssl-with-bazel/src/crypto/evp/p_hkdf.c +233 -0
  359. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +5 -5
  360. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c +42 -25
  361. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c +4 -5
  362. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c +35 -47
  363. data/third_party/boringssl-with-bazel/src/crypto/evp/print.c +135 -244
  364. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +2 -4
  365. data/third_party/boringssl-with-bazel/src/crypto/evp/sign.c +15 -10
  366. data/third_party/boringssl-with-bazel/src/crypto/ex_data.c +29 -15
  367. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +0 -2
  368. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +13 -14
  369. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +3 -13
  370. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.c +13 -7
  371. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +9 -7
  372. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +35 -27
  373. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +16 -26
  374. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.c +88 -60
  375. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.c +4 -3
  376. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c +0 -2
  377. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +1 -1
  378. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.c +1 -1
  379. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +99 -113
  380. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +0 -1
  381. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +5 -3
  382. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.c +112 -168
  383. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +86 -31
  384. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +11 -6
  385. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +4 -5
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +4 -5
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +13 -0
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c +13 -5
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c +19 -108
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.h +19 -15
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.c +15 -16
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +22 -21
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/aead.c +3 -0
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +79 -19
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +102 -99
  396. data/third_party/boringssl-with-bazel/src/crypto/{cipher_extra → fipsmodule/cipher}/e_aesccm.c +52 -46
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h +39 -0
  398. data/third_party/boringssl-with-bazel/src/crypto/{cmac → fipsmodule/cmac}/cmac.c +55 -11
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c +2 -3
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +21 -6
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +56 -0
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +5 -3
  403. data/third_party/boringssl-with-bazel/src/crypto/{evp → fipsmodule/digestsign}/digestsign.c +51 -15
  404. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +25 -25
  405. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +91 -17
  406. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +5 -5
  407. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +34 -12
  408. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +54 -23
  409. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +44 -60
  410. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64-table.h → p256-nistz-table.h} +1 -1
  411. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64.c → p256-nistz.c} +60 -53
  412. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64.h → p256-nistz.h} +5 -13
  413. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +48 -36
  414. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +2 -8
  415. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +2 -7
  416. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -3
  417. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +0 -1
  418. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +8 -0
  419. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +42 -14
  420. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +6 -0
  421. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/hmac.c +52 -24
  422. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +9 -15
  423. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +1 -4
  424. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +2 -4
  425. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +71 -43
  426. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +14 -16
  427. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -4
  428. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.c +31 -13
  429. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +16 -8
  430. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +3 -2
  431. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +2 -2
  432. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +9 -38
  433. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +73 -59
  434. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -45
  435. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +0 -1
  436. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +22 -0
  437. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +63 -52
  438. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +107 -62
  439. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +58 -31
  440. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +41 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +523 -422
  442. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/internal.h +89 -0
  443. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/service_indicator.c +334 -0
  444. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +3 -12
  445. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +2 -0
  446. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +12 -8
  447. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +14 -12
  448. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +19 -6
  449. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +32 -14
  450. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +65 -29
  451. data/third_party/boringssl-with-bazel/src/crypto/internal.h +373 -18
  452. data/third_party/boringssl-with-bazel/src/crypto/kyber/internal.h +61 -0
  453. data/third_party/boringssl-with-bazel/src/crypto/kyber/keccak.c +205 -0
  454. data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +13 -1
  455. data/third_party/boringssl-with-bazel/src/crypto/mem.c +220 -13
  456. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +19 -7
  457. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +13 -1
  458. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +81 -90
  459. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +150 -245
  460. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +629 -613
  461. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c +17 -17
  462. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +142 -149
  463. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +99 -131
  464. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c +0 -1
  465. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c +0 -1
  466. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +0 -1
  467. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +0 -3
  468. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -66
  469. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +31 -38
  470. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +2 -1
  471. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +18 -31
  472. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -0
  473. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +8 -1
  474. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +129 -5
  475. data/third_party/boringssl-with-bazel/src/crypto/refcount_c11.c +0 -2
  476. data/third_party/boringssl-with-bazel/src/crypto/refcount_lock.c +3 -4
  477. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +8 -11
  478. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +61 -27
  479. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +10 -13
  480. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +10 -13
  481. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +66 -34
  482. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +190 -77
  483. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +81 -284
  484. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +109 -42
  485. data/third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c +22 -24
  486. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +54 -55
  487. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +32 -34
  488. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +32 -16
  489. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +465 -704
  490. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +284 -331
  491. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +183 -178
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c +11 -15
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +67 -50
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +153 -150
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/policy.c +786 -0
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +95 -102
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +72 -57
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +12 -10
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +227 -252
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +52 -47
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +3 -4
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +230 -224
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +161 -327
  504. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c +37 -33
  505. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c +14 -31
  506. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +55 -85
  507. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +534 -618
  508. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +129 -122
  509. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +116 -182
  510. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +132 -132
  511. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +181 -202
  512. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +64 -79
  513. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +175 -160
  514. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1865 -2050
  515. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +433 -462
  516. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +156 -163
  517. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +267 -263
  518. data/third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c +40 -15
  519. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +59 -63
  520. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +63 -67
  521. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +114 -144
  522. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +25 -26
  523. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +326 -415
  524. data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +8 -7
  525. data/third_party/boringssl-with-bazel/src/crypto/x509/x_info.c +30 -28
  526. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +354 -370
  527. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +37 -32
  528. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +116 -119
  529. data/third_party/boringssl-with-bazel/src/crypto/x509/x_req.c +36 -26
  530. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +3 -4
  531. data/third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c +10 -13
  532. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +3 -4
  533. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +419 -261
  534. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +113 -105
  535. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +11 -15
  536. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +78 -170
  537. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +126 -131
  538. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c +3 -4
  539. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +465 -469
  540. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c +56 -54
  541. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +46 -49
  542. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +309 -346
  543. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +341 -365
  544. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +429 -393
  545. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +29 -24
  546. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c +65 -59
  547. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +125 -121
  548. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +43 -42
  549. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +122 -125
  550. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c +50 -20
  551. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +247 -253
  552. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +386 -389
  553. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c +45 -32
  554. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c +57 -54
  555. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c +63 -67
  556. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +143 -136
  557. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +664 -707
  558. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +83 -75
  559. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1062 -1146
  560. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +8 -4
  561. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +28 -48
  562. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +211 -187
  563. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +26 -78
  564. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +19 -14
  565. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +21 -2
  566. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +49 -17
  567. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +99 -29
  568. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +49 -60
  569. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +2 -15
  570. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +16 -200
  571. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +34 -0
  572. data/third_party/boringssl-with-bazel/src/include/openssl/ctrdrbg.h +82 -0
  573. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +32 -30
  574. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +7 -0
  575. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +4 -0
  576. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +48 -5
  577. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +37 -8
  578. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +1 -0
  579. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +33 -5
  580. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +22 -30
  581. data/third_party/boringssl-with-bazel/src/include/openssl/ex_data.h +1 -1
  582. data/third_party/boringssl-with-bazel/src/include/openssl/hmac.h +7 -0
  583. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +41 -16
  584. data/third_party/boringssl-with-bazel/src/include/openssl/kdf.h +91 -0
  585. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +74 -8
  586. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +13 -0
  587. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +1 -0
  588. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +11 -15
  589. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +8 -0
  590. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +12 -1
  591. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +7 -4
  592. data/third_party/boringssl-with-bazel/src/include/openssl/service_indicator.h +96 -0
  593. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +13 -21
  594. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +139 -75
  595. data/third_party/boringssl-with-bazel/src/include/openssl/ssl3.h +1 -6
  596. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +384 -286
  597. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +5 -6
  598. data/third_party/boringssl-with-bazel/src/include/openssl/time.h +41 -0
  599. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +18 -7
  600. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +49 -23
  601. data/third_party/boringssl-with-bazel/src/include/openssl/type_check.h +0 -11
  602. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +1592 -1074
  603. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +202 -205
  604. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +2 -2
  605. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +6 -13
  606. data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +17 -18
  607. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +4 -5
  608. data/third_party/boringssl-with-bazel/src/ssl/dtls_record.cc +25 -33
  609. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +34 -20
  610. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +65 -34
  611. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +198 -54
  612. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +5 -5
  613. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +32 -28
  614. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +76 -44
  615. data/third_party/boringssl-with-bazel/src/ssl/internal.h +130 -98
  616. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +27 -11
  617. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  618. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +91 -75
  619. data/third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc +8 -10
  620. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +39 -65
  621. data/third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc +1 -0
  622. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +5 -9
  623. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +30 -33
  624. data/third_party/boringssl-with-bazel/src/ssl/ssl_file.cc +77 -100
  625. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +120 -107
  626. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +164 -30
  627. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +150 -60
  628. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +22 -11
  629. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +22 -6
  630. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +15 -13
  631. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +5 -43
  632. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +7 -4
  633. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +2 -2
  634. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +22 -34
  635. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +2 -2
  636. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +16 -98
  637. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +1241 -657
  638. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +751 -398
  639. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +3551 -1938
  640. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +1272 -487
  641. metadata +103 -70
  642. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +0 -39
  643. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +0 -30
  644. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +0 -29
  645. data/src/core/lib/gprpp/global_config.h +0 -93
  646. data/src/core/lib/gprpp/global_config_env.cc +0 -140
  647. data/src/core/lib/gprpp/global_config_env.h +0 -133
  648. data/src/core/lib/gprpp/global_config_generic.h +0 -40
  649. data/src/core/lib/promise/intra_activity_waiter.h +0 -55
  650. data/src/core/lib/security/security_connector/ssl_utils_config.cc +0 -32
  651. data/src/core/lib/security/security_connector/ssl_utils_config.h +0 -29
  652. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +0 -195
  653. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +0 -83
  654. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +0 -236
  655. data/third_party/boringssl-with-bazel/src/crypto/asn1/charmap.h +0 -15
  656. data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +0 -206
  657. data/third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c +0 -38
  658. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1-altivec.c +0 -361
  659. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +0 -287
  660. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +0 -132
  661. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +0 -155
  662. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +0 -131
  663. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +0 -189
  664. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +0 -843
  665. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +0 -289
  666. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c +0 -57
  667. /data/src/core/lib/gpr/{log_android.cc → android/log.cc} +0 -0
  668. /data/src/core/lib/gpr/{cpu_iphone.cc → iphone/cpu.cc} +0 -0
  669. /data/src/core/lib/gpr/{cpu_linux.cc → linux/cpu.cc} +0 -0
  670. /data/src/core/lib/gpr/{log_linux.cc → linux/log.cc} +0 -0
  671. /data/src/core/lib/gpr/{tmpfile_msys.cc → msys/tmpfile.cc} +0 -0
  672. /data/src/core/lib/gpr/{cpu_posix.cc → posix/cpu.cc} +0 -0
  673. /data/src/core/lib/gpr/{log_posix.cc → posix/log.cc} +0 -0
  674. /data/src/core/lib/gpr/{string_posix.cc → posix/string.cc} +0 -0
  675. /data/src/core/lib/gpr/{sync_posix.cc → posix/sync.cc} +0 -0
  676. /data/src/core/lib/gpr/{time_posix.cc → posix/time.cc} +0 -0
  677. /data/src/core/lib/gpr/{tmpfile_posix.cc → posix/tmpfile.cc} +0 -0
  678. /data/src/core/lib/gpr/{cpu_windows.cc → windows/cpu.cc} +0 -0
  679. /data/src/core/lib/gpr/{log_windows.cc → windows/log.cc} +0 -0
  680. /data/src/core/lib/gpr/{string_windows.cc → windows/string.cc} +0 -0
  681. /data/src/core/lib/gpr/{string_util_windows.cc → windows/string_util.cc} +0 -0
  682. /data/src/core/lib/gpr/{sync_windows.cc → windows/sync.cc} +0 -0
  683. /data/src/core/lib/gpr/{time_windows.cc → windows/time.cc} +0 -0
  684. /data/src/core/lib/gpr/{tmpfile_windows.cc → windows/tmpfile.cc} +0 -0
  685. /data/src/core/lib/gprpp/{env_linux.cc → linux/env.cc} +0 -0
  686. /data/src/core/lib/gprpp/{env_posix.cc → posix/env.cc} +0 -0
  687. /data/src/core/lib/gprpp/{stat_posix.cc → posix/stat.cc} +0 -0
  688. /data/src/core/lib/gprpp/{env_windows.cc → windows/env.cc} +0 -0
  689. /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
  }