grpc 1.55.3 → 1.56.0.pre3

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 (385) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +100 -70
  3. data/include/grpc/event_engine/event_engine.h +4 -3
  4. data/include/grpc/grpc_audit_logging.h +96 -0
  5. data/include/grpc/module.modulemap +2 -0
  6. data/include/grpc/support/json.h +218 -0
  7. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +5 -0
  8. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
  9. data/src/core/ext/filters/client_channel/channel_connectivity.cc +4 -4
  10. data/src/core/ext/filters/client_channel/client_channel.cc +82 -98
  11. data/src/core/ext/filters/client_channel/client_channel.h +4 -0
  12. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -18
  13. data/src/core/ext/filters/client_channel/client_channel_internal.h +16 -21
  14. data/src/core/ext/filters/client_channel/config_selector.h +9 -24
  15. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +3 -0
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +5 -4
  17. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +455 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.h +54 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h +186 -0
  20. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +2 -7
  21. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +52 -20
  22. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +23 -2
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -6
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +1 -9
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +16 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +18 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +12 -9
  28. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -4
  29. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +36 -13
  30. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +76 -6
  31. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +32 -39
  32. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +4 -10
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +52 -47
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +1 -9
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +14 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -43
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +7 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +12 -19
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +35 -33
  40. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +29 -4
  41. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/service_config_helper.cc +1 -1
  42. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +28 -27
  43. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +163 -46
  44. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +16 -1
  45. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -0
  46. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +10 -40
  47. data/src/core/ext/filters/client_channel/subchannel.cc +10 -196
  48. data/src/core/ext/filters/client_channel/subchannel.h +3 -43
  49. data/src/core/ext/filters/http/message_compress/compression_filter.cc +5 -5
  50. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +100 -6
  51. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -8
  52. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -3
  53. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +16 -1
  54. data/src/core/ext/transport/chttp2/transport/flow_control.cc +46 -95
  55. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +543 -567
  56. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +9 -150
  57. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +32 -46
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +5 -18
  59. data/src/core/ext/transport/chttp2/transport/internal.h +1 -15
  60. data/src/core/ext/transport/chttp2/transport/parsing.cc +12 -12
  61. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +11 -2
  62. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +15 -0
  63. data/src/core/ext/xds/certificate_provider_store.cc +4 -9
  64. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  65. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +30 -42
  66. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +14 -9
  67. data/src/core/ext/xds/xds_api.cc +9 -6
  68. data/src/core/ext/xds/xds_api.h +3 -2
  69. data/src/core/ext/xds/xds_audit_logger_registry.cc +122 -0
  70. data/src/core/ext/xds/xds_audit_logger_registry.h +68 -0
  71. data/src/core/ext/xds/xds_bootstrap_grpc.cc +21 -9
  72. data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -0
  73. data/src/core/ext/xds/xds_client.cc +5 -4
  74. data/src/core/ext/xds/xds_client_stats.h +1 -1
  75. data/src/core/ext/xds/xds_cluster.cc +20 -19
  76. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +11 -8
  77. data/src/core/ext/xds/xds_common_types.cc +3 -1
  78. data/src/core/ext/xds/xds_http_fault_filter.cc +16 -13
  79. data/src/core/ext/xds/xds_http_fault_filter.h +2 -1
  80. data/src/core/ext/xds/xds_http_filters.h +4 -2
  81. data/src/core/ext/xds/xds_http_rbac_filter.cc +154 -67
  82. data/src/core/ext/xds/xds_http_rbac_filter.h +2 -1
  83. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +15 -11
  84. data/src/core/ext/xds/xds_http_stateful_session_filter.h +2 -1
  85. data/src/core/ext/xds/xds_lb_policy_registry.cc +22 -16
  86. data/src/core/ext/xds/xds_listener.cc +1 -0
  87. data/src/core/ext/xds/xds_route_config.cc +40 -3
  88. data/src/core/ext/xds/xds_routing.cc +2 -2
  89. data/src/core/ext/xds/xds_transport_grpc.cc +3 -1
  90. data/src/core/lib/avl/avl.h +5 -0
  91. data/src/core/lib/backoff/random_early_detection.h +0 -5
  92. data/src/core/lib/channel/channel_args.cc +80 -22
  93. data/src/core/lib/channel/channel_args.h +34 -1
  94. data/src/core/lib/channel/channel_trace.cc +16 -12
  95. data/src/core/lib/channel/channelz.cc +159 -132
  96. data/src/core/lib/channel/channelz.h +42 -35
  97. data/src/core/lib/channel/channelz_registry.cc +23 -20
  98. data/src/core/lib/channel/connected_channel.cc +17 -6
  99. data/src/core/lib/channel/promise_based_filter.cc +0 -4
  100. data/src/core/lib/channel/promise_based_filter.h +2 -0
  101. data/src/core/lib/compression/compression_internal.cc +2 -5
  102. data/src/core/lib/config/config_vars.cc +20 -18
  103. data/src/core/lib/config/config_vars.h +4 -4
  104. data/src/core/lib/config/load_config.cc +13 -0
  105. data/src/core/lib/config/load_config.h +6 -0
  106. data/src/core/lib/debug/event_log.h +1 -1
  107. data/src/core/lib/debug/stats_data.h +1 -1
  108. data/src/core/lib/debug/trace.cc +24 -55
  109. data/src/core/lib/debug/trace.h +3 -1
  110. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +211 -0
  111. data/src/core/lib/event_engine/cf_engine/cf_engine.h +86 -0
  112. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +354 -0
  113. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +146 -0
  114. data/src/core/lib/event_engine/cf_engine/cftype_unique_ref.h +79 -0
  115. data/src/core/lib/event_engine/default_event_engine.cc +13 -1
  116. data/src/core/lib/event_engine/default_event_engine_factory.cc +14 -2
  117. data/src/core/lib/event_engine/poller.h +2 -2
  118. data/src/core/lib/event_engine/posix.h +4 -0
  119. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +1 -1
  120. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +7 -18
  121. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -0
  122. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +3 -2
  123. data/src/core/lib/event_engine/posix_engine/posix_engine.h +1 -2
  124. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -33
  125. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +7 -11
  126. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  127. data/src/core/lib/event_engine/shim.cc +7 -1
  128. data/src/core/lib/event_engine/{thread_pool.cc → thread_pool/original_thread_pool.cc} +28 -25
  129. data/src/core/lib/event_engine/{thread_pool.h → thread_pool/original_thread_pool.h} +11 -15
  130. data/src/core/lib/event_engine/thread_pool/thread_pool.h +50 -0
  131. data/src/core/lib/event_engine/{executor/executor.h → thread_pool/thread_pool_factory.cc} +17 -15
  132. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +489 -0
  133. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +249 -0
  134. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +166 -0
  135. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +108 -0
  136. data/src/core/lib/event_engine/windows/iocp.cc +4 -3
  137. data/src/core/lib/event_engine/windows/iocp.h +3 -3
  138. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  139. data/src/core/lib/event_engine/windows/win_socket.h +4 -4
  140. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -10
  141. data/src/core/lib/event_engine/windows/windows_endpoint.h +3 -2
  142. data/src/core/lib/event_engine/windows/windows_engine.cc +19 -17
  143. data/src/core/lib/event_engine/windows/windows_engine.h +6 -6
  144. data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
  145. data/src/core/lib/event_engine/windows/windows_listener.h +3 -2
  146. data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +63 -0
  147. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +71 -0
  148. data/src/core/lib/event_engine/work_queue/work_queue.h +62 -0
  149. data/src/core/lib/experiments/config.cc +38 -7
  150. data/src/core/lib/experiments/config.h +16 -0
  151. data/src/core/lib/experiments/experiments.cc +67 -20
  152. data/src/core/lib/experiments/experiments.h +27 -21
  153. data/src/core/lib/gpr/log_internal.h +55 -0
  154. data/src/core/lib/gprpp/crash.cc +10 -0
  155. data/src/core/lib/gprpp/crash.h +3 -0
  156. data/src/core/lib/gprpp/per_cpu.cc +33 -0
  157. data/src/core/lib/gprpp/per_cpu.h +29 -6
  158. data/src/core/lib/gprpp/time.cc +1 -0
  159. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  160. data/src/core/lib/iomgr/endpoint_cfstream.cc +10 -8
  161. data/src/core/lib/iomgr/ev_apple.cc +12 -12
  162. data/src/core/lib/iomgr/ev_epoll1_linux.cc +10 -3
  163. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +15 -1
  164. data/src/core/lib/iomgr/iocp_windows.cc +24 -3
  165. data/src/core/lib/iomgr/iocp_windows.h +11 -0
  166. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -1
  167. data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -2
  168. data/src/core/lib/iomgr/socket_windows.cc +61 -7
  169. data/src/core/lib/iomgr/socket_windows.h +9 -2
  170. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -3
  171. data/src/core/lib/iomgr/tcp_server_posix.cc +156 -140
  172. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -13
  173. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +0 -21
  174. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -1
  175. data/src/core/lib/json/json.h +2 -166
  176. data/src/core/lib/json/json_object_loader.cc +8 -9
  177. data/src/core/lib/json/json_object_loader.h +25 -18
  178. data/src/core/lib/json/json_reader.cc +13 -6
  179. data/src/core/lib/json/json_util.cc +6 -11
  180. data/src/core/lib/json/json_writer.cc +7 -8
  181. data/src/core/lib/load_balancing/lb_policy.h +13 -0
  182. data/src/core/lib/load_balancing/lb_policy_registry.cc +2 -1
  183. data/src/core/lib/matchers/matchers.cc +3 -4
  184. data/src/core/lib/matchers/matchers.h +2 -1
  185. data/src/core/lib/promise/activity.cc +5 -0
  186. data/src/core/lib/promise/activity.h +10 -0
  187. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  188. data/src/core/lib/promise/party.cc +31 -13
  189. data/src/core/lib/promise/party.h +11 -2
  190. data/src/core/lib/promise/pipe.h +9 -2
  191. data/src/core/lib/promise/prioritized_race.h +95 -0
  192. data/src/core/lib/promise/sleep.cc +2 -1
  193. data/src/core/lib/resolver/server_address.cc +0 -8
  194. data/src/core/lib/resolver/server_address.h +0 -6
  195. data/src/core/lib/resource_quota/memory_quota.cc +7 -7
  196. data/src/core/lib/resource_quota/memory_quota.h +1 -2
  197. data/src/core/lib/security/authorization/audit_logging.cc +98 -0
  198. data/src/core/lib/security/authorization/audit_logging.h +73 -0
  199. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +47 -2
  200. data/src/core/lib/security/authorization/grpc_authorization_engine.h +18 -1
  201. data/src/core/lib/security/authorization/rbac_policy.cc +36 -4
  202. data/src/core/lib/security/authorization/rbac_policy.h +19 -2
  203. data/src/core/lib/security/authorization/stdout_logger.cc +75 -0
  204. data/src/core/lib/security/authorization/stdout_logger.h +61 -0
  205. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +8 -4
  206. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +8 -18
  207. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +14 -8
  208. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +19 -12
  209. data/src/core/lib/security/credentials/external/external_account_credentials.cc +4 -2
  210. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -0
  211. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -0
  212. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -0
  213. data/src/core/lib/security/credentials/jwt/json_token.cc +15 -14
  214. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -2
  215. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +1 -0
  216. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -0
  217. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -5
  218. data/src/core/lib/security/util/json_util.cc +1 -0
  219. data/src/core/lib/service_config/service_config_call_data.h +49 -20
  220. data/src/core/lib/service_config/service_config_impl.cc +2 -1
  221. data/src/core/lib/surface/call.cc +38 -23
  222. data/src/core/lib/surface/completion_queue.cc +6 -2
  223. data/src/core/lib/surface/validate_metadata.cc +22 -37
  224. data/src/core/lib/surface/validate_metadata.h +3 -13
  225. data/src/core/lib/surface/version.cc +2 -2
  226. data/src/core/lib/transport/batch_builder.cc +15 -12
  227. data/src/core/lib/transport/batch_builder.h +39 -35
  228. data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -2
  229. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  230. data/src/ruby/ext/grpc/extconf.rb +8 -9
  231. data/src/ruby/lib/grpc/version.rb +1 -1
  232. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +9 -8
  233. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +1 -1
  234. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +3 -3
  235. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +10 -6
  236. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +7 -4
  237. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +6 -4
  238. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -1
  239. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +5 -9
  240. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +4 -2
  241. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +31 -22
  242. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +29 -26
  243. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +8 -0
  244. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +189 -13
  245. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.c +62 -0
  246. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_openbsd.c +31 -0
  247. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +6 -4
  248. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +795 -795
  249. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -5
  250. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +4 -0
  251. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +18 -6
  252. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +15 -7
  253. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +1 -1
  254. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +1 -1
  255. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  256. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +3 -0
  257. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +24 -24
  258. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +1 -1
  259. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +7 -7
  260. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +74 -74
  261. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +1 -2
  262. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +11 -11
  263. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +12 -12
  264. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +14 -15
  265. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +1 -1
  266. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +10 -10
  267. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +23 -23
  268. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +13 -13
  269. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +1 -1
  270. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +2 -2
  271. data/third_party/boringssl-with-bazel/src/crypto/{hkdf → fipsmodule/hkdf}/hkdf.c +1 -1
  272. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +2 -10
  273. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +1 -4
  274. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +115 -133
  275. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +12 -14
  276. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +57 -47
  277. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -8
  278. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c +27 -28
  279. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -23
  280. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +21 -16
  281. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +5 -288
  282. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +143 -83
  283. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +95 -183
  284. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +71 -0
  285. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h +8 -0
  286. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +33 -0
  287. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +162 -6
  288. data/third_party/boringssl-with-bazel/src/crypto/internal.h +18 -0
  289. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +18 -11
  290. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +6 -13
  291. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +18 -14
  292. data/third_party/boringssl-with-bazel/src/crypto/{refcount_lock.c → refcount_no_threads.c} +3 -13
  293. data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +89 -0
  294. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/internal.h +77 -0
  295. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.c +568 -0
  296. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +62 -0
  297. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +218 -44
  298. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +35 -0
  299. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +588 -39
  300. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +27 -18
  301. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +1 -1
  302. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +17 -39
  303. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +39 -48
  304. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +0 -140
  305. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +72 -23
  306. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -14
  307. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +1 -1
  308. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  309. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +1 -1
  310. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +33 -46
  311. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +1 -0
  312. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +3 -5
  313. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +14 -46
  314. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -26
  315. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +17 -10
  316. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1 -1
  317. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +5 -7
  318. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +6 -4
  319. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +32 -1
  320. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +0 -4
  321. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +1 -4
  322. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +3 -3
  323. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +28 -0
  324. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +2 -11
  325. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -3
  326. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +91 -1
  327. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +5 -0
  328. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +149 -20
  329. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +4 -0
  330. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  331. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +8 -0
  332. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +774 -615
  333. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +42 -10
  334. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +11 -6
  335. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +2 -4
  336. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +24 -16
  337. data/third_party/boringssl-with-bazel/src/ssl/internal.h +65 -18
  338. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +37 -18
  339. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +187 -193
  340. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +13 -129
  341. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +85 -10
  342. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +17 -4
  343. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +27 -19
  344. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +1 -1
  345. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +5 -21
  346. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -2
  347. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_msvc.h +1281 -0
  348. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64_msvc.h +2002 -0
  349. data/third_party/cares/cares/include/ares.h +23 -1
  350. data/third_party/cares/cares/{src/lib → include}/ares_nameser.h +9 -7
  351. data/third_party/cares/cares/include/ares_rules.h +2 -2
  352. data/third_party/cares/cares/include/ares_version.h +3 -3
  353. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +266 -0
  354. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +240 -0
  355. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +49 -80
  356. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +37 -43
  357. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +12 -4
  358. data/third_party/cares/cares/src/lib/ares_data.c +16 -0
  359. data/third_party/cares/cares/src/lib/ares_data.h +7 -0
  360. data/third_party/cares/cares/src/lib/ares_destroy.c +8 -0
  361. data/third_party/cares/cares/src/lib/ares_expand_name.c +17 -6
  362. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +1 -0
  363. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +156 -78
  364. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +130 -326
  365. data/third_party/cares/cares/src/lib/ares_init.c +97 -485
  366. data/third_party/cares/cares/src/lib/ares_library_init.c +2 -89
  367. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +23 -142
  368. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +22 -142
  369. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +184 -0
  370. data/third_party/cares/cares/src/lib/ares_private.h +30 -16
  371. data/third_party/cares/cares/src/lib/ares_process.c +55 -16
  372. data/third_party/cares/cares/src/lib/ares_query.c +1 -35
  373. data/third_party/cares/cares/src/lib/ares_rand.c +279 -0
  374. data/third_party/cares/cares/src/lib/ares_send.c +5 -7
  375. data/third_party/cares/cares/src/lib/ares_strdup.c +12 -19
  376. data/third_party/cares/cares/src/lib/ares_strsplit.c +44 -128
  377. data/third_party/cares/cares/src/lib/ares_strsplit.h +9 -10
  378. data/third_party/cares/cares/src/lib/inet_net_pton.c +78 -116
  379. data/third_party/cares/cares/src/tools/ares_getopt.h +53 -0
  380. metadata +50 -16
  381. data/src/core/ext/filters/client_channel/health/health_check_client.cc +0 -175
  382. data/src/core/ext/filters/client_channel/health/health_check_client.h +0 -43
  383. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +0 -176
  384. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +0 -325
  385. data/third_party/cares/cares/src/lib/ares_library_init.h +0 -43
@@ -277,6 +277,12 @@ OPENSSL_EXPORT int X509_get_signature_nid(const X509 *x509);
277
277
  // |i2d_re_X509_tbs| instead.
278
278
  OPENSSL_EXPORT int i2d_X509_tbs(X509 *x509, unsigned char **outp);
279
279
 
280
+ // X509_verify checks that |x509| has a valid signature by |pkey|. It returns
281
+ // one if the signature is valid and zero otherwise. Note this function only
282
+ // checks the signature itself and does not perform a full certificate
283
+ // validation.
284
+ OPENSSL_EXPORT int X509_verify(X509 *x509, EVP_PKEY *pkey);
285
+
280
286
 
281
287
  // Issuing certificates.
282
288
  //
@@ -342,16 +348,17 @@ OPENSSL_EXPORT X509_EXTENSION *X509_delete_ext(X509 *x, int loc);
342
348
  OPENSSL_EXPORT int X509_add_ext(X509 *x, const X509_EXTENSION *ex, int loc);
343
349
 
344
350
  // X509_sign signs |x509| with |pkey| and replaces the signature algorithm and
345
- // signature fields. It returns one on success and zero on error. This function
346
- // uses digest algorithm |md|, or |pkey|'s default if NULL. Other signing
347
- // parameters use |pkey|'s defaults. To customize them, use |X509_sign_ctx|.
351
+ // signature fields. It returns the length of the signature on success and zero
352
+ // on error. This function uses digest algorithm |md|, or |pkey|'s default if
353
+ // NULL. Other signing parameters use |pkey|'s defaults. To customize them, use
354
+ // |X509_sign_ctx|.
348
355
  OPENSSL_EXPORT int X509_sign(X509 *x509, EVP_PKEY *pkey, const EVP_MD *md);
349
356
 
350
357
  // X509_sign_ctx signs |x509| with |ctx| and replaces the signature algorithm
351
- // and signature fields. It returns one on success and zero on error. The
352
- // signature algorithm and parameters come from |ctx|, which must have been
353
- // initialized with |EVP_DigestSignInit|. The caller should configure the
354
- // corresponding |EVP_PKEY_CTX| before calling this function.
358
+ // and signature fields. It returns the length of the signature on success and
359
+ // zero on error. The signature algorithm and parameters come from |ctx|, which
360
+ // must have been initialized with |EVP_DigestSignInit|. The caller should
361
+ // configure the corresponding |EVP_PKEY_CTX| before calling this function.
355
362
  OPENSSL_EXPORT int X509_sign_ctx(X509 *x509, EVP_MD_CTX *ctx);
356
363
 
357
364
  // i2d_re_X509_tbs serializes the TBSCertificate portion of |x509|, as described
@@ -413,13 +420,13 @@ OPENSSL_EXPORT X509 *d2i_X509_AUX(X509 **x509, const unsigned char **inp,
413
420
  // NULL, the alias is cleared instead. Aliases are not part of the certificate
414
421
  // itself and will not be serialized by |i2d_X509|.
415
422
  OPENSSL_EXPORT int X509_alias_set1(X509 *x509, const unsigned char *name,
416
- int len);
423
+ ossl_ssize_t len);
417
424
 
418
425
  // X509_keyid_set1 sets |x509|'s key ID to |len| bytes from |id|. If |id| is
419
426
  // NULL, the key ID is cleared instead. Key IDs are not part of the certificate
420
427
  // itself and will not be serialized by |i2d_X509|.
421
428
  OPENSSL_EXPORT int X509_keyid_set1(X509 *x509, const unsigned char *id,
422
- int len);
429
+ ossl_ssize_t len);
423
430
 
424
431
  // X509_alias_get0 looks up |x509|'s alias. If found, it sets |*out_len| to the
425
432
  // alias's length and returns a pointer to a buffer containing the contents. If
@@ -576,6 +583,10 @@ OPENSSL_EXPORT int X509_CRL_get_signature_nid(const X509_CRL *crl);
576
583
  // instead.
577
584
  OPENSSL_EXPORT int i2d_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp);
578
585
 
586
+ // X509_CRL_verify checks that |crl| has a valid signature by |pkey|. It returns
587
+ // one if the signature is valid and zero otherwise.
588
+ OPENSSL_EXPORT int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *pkey);
589
+
579
590
 
580
591
  // Issuing certificate revocation lists.
581
592
  //
@@ -624,18 +635,18 @@ OPENSSL_EXPORT int X509_CRL_add_ext(X509_CRL *x, const X509_EXTENSION *ex,
624
635
  int loc);
625
636
 
626
637
  // X509_CRL_sign signs |crl| with |pkey| and replaces the signature algorithm
627
- // and signature fields. It returns one on success and zero on error. This
628
- // function uses digest algorithm |md|, or |pkey|'s default if NULL. Other
629
- // signing parameters use |pkey|'s defaults. To customize them, use
630
- // |X509_CRL_sign_ctx|.
638
+ // and signature fields. It returns the length of the signature on success and
639
+ // zero on error. This function uses digest algorithm |md|, or |pkey|'s default
640
+ // if NULL. Other signing parameters use |pkey|'s defaults. To customize them,
641
+ // use |X509_CRL_sign_ctx|.
631
642
  OPENSSL_EXPORT int X509_CRL_sign(X509_CRL *crl, EVP_PKEY *pkey,
632
643
  const EVP_MD *md);
633
644
 
634
645
  // X509_CRL_sign_ctx signs |crl| with |ctx| and replaces the signature algorithm
635
- // and signature fields. It returns one on success and zero on error. The
636
- // signature algorithm and parameters come from |ctx|, which must have been
637
- // initialized with |EVP_DigestSignInit|. The caller should configure the
638
- // corresponding |EVP_PKEY_CTX| before calling this function.
646
+ // and signature fields. It returns the length of the signature on success and
647
+ // zero on error. The signature algorithm and parameters come from |ctx|, which
648
+ // must have been initialized with |EVP_DigestSignInit|. The caller should
649
+ // configure the corresponding |EVP_PKEY_CTX| before calling this function.
639
650
  OPENSSL_EXPORT int X509_CRL_sign_ctx(X509_CRL *crl, EVP_MD_CTX *ctx);
640
651
 
641
652
  // i2d_re_X509_CRL_tbs serializes the TBSCertList portion of |crl|, as described
@@ -710,7 +721,6 @@ OPENSSL_EXPORT X509_REQ *d2i_X509_REQ(X509_REQ **out, const uint8_t **inp,
710
721
  // mutated.
711
722
  OPENSSL_EXPORT int i2d_X509_REQ(X509_REQ *req, uint8_t **outp);
712
723
 
713
-
714
724
  // X509_REQ_VERSION_1 is the version constant for |X509_REQ| objects. No other
715
725
  // versions are defined.
716
726
  #define X509_REQ_VERSION_1 0
@@ -731,6 +741,46 @@ OPENSSL_EXPORT X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req);
731
741
  // |EVP_PKEY_free| when done.
732
742
  OPENSSL_EXPORT EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req);
733
743
 
744
+ // X509_REQ_get_attr_count returns the number of attributes in |req|.
745
+ OPENSSL_EXPORT int X509_REQ_get_attr_count(const X509_REQ *req);
746
+
747
+ // X509_REQ_get_attr returns the attribute at index |loc| in |req|, or NULL if
748
+ // out of bounds.
749
+ OPENSSL_EXPORT X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc);
750
+
751
+ // X509_REQ_get_attr_by_NID returns the index of the attribute in |req| of type
752
+ // |nid|, or a negative number if not found. If found, callers can use
753
+ // |X509_REQ_get_attr| to look up the attribute by index.
754
+ //
755
+ // If |lastpos| is non-negative, it begins searching at |lastpos| + 1. Callers
756
+ // can thus loop over all matching attributes by first passing -1 and then
757
+ // passing the previously-returned value until no match is returned.
758
+ OPENSSL_EXPORT int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid,
759
+ int lastpos);
760
+
761
+ // X509_REQ_get_attr_by_OBJ behaves like |X509_REQ_get_attr_by_NID| but looks
762
+ // for attributes of type |obj|.
763
+ OPENSSL_EXPORT int X509_REQ_get_attr_by_OBJ(const X509_REQ *req,
764
+ const ASN1_OBJECT *obj,
765
+ int lastpos);
766
+
767
+ // X509_REQ_extension_nid returns one if |nid| is a supported CSR attribute type
768
+ // for carrying extensions and zero otherwise. The supported types are
769
+ // |NID_ext_req| (pkcs-9-at-extensionRequest from RFC 2985) and |NID_ms_ext_req|
770
+ // (a Microsoft szOID_CERT_EXTENSIONS variant).
771
+ OPENSSL_EXPORT int X509_REQ_extension_nid(int nid);
772
+
773
+ // X509_REQ_get_extensions decodes the list of requested extensions in |req| and
774
+ // returns a newly-allocated |STACK_OF(X509_EXTENSION)| containing the result.
775
+ // It returns NULL on error, or if |req| did not request extensions.
776
+ //
777
+ // CSRs do not store extensions directly. Instead there are attribute types
778
+ // which are defined to hold extensions. See |X509_REQ_extension_nid|. This
779
+ // function supports both pkcs-9-at-extensionRequest from RFC 2985 and the
780
+ // Microsoft szOID_CERT_EXTENSIONS variant. If both are present,
781
+ // pkcs-9-at-extensionRequest is preferred.
782
+ OPENSSL_EXPORT STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req);
783
+
734
784
  // X509_REQ_get0_signature sets |*out_sig| and |*out_alg| to the signature and
735
785
  // signature algorithm of |req|, respectively. Either output pointer may be NULL
736
786
  // to ignore the value.
@@ -743,6 +793,10 @@ OPENSSL_EXPORT void X509_REQ_get0_signature(const X509_REQ *req,
743
793
  // a known NID.
744
794
  OPENSSL_EXPORT int X509_REQ_get_signature_nid(const X509_REQ *req);
745
795
 
796
+ // X509_REQ_verify checks that |req| has a valid signature by |pkey|. It returns
797
+ // one if the signature is valid and zero otherwise.
798
+ OPENSSL_EXPORT int X509_REQ_verify(X509_REQ *req, EVP_PKEY *pkey);
799
+
746
800
 
747
801
  // Issuing certificate requests.
748
802
  //
@@ -770,19 +824,68 @@ OPENSSL_EXPORT int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name);
770
824
  // and internally copies and updates reference counts as needed.
771
825
  OPENSSL_EXPORT int X509_REQ_set_pubkey(X509_REQ *req, EVP_PKEY *pkey);
772
826
 
827
+ // X509_REQ_delete_attr removes the attribute at index |loc| in |req|. It
828
+ // returns the removed attribute to the caller, or NULL if |loc| was out of
829
+ // bounds. If non-NULL, the caller must release the result with
830
+ // |X509_ATTRIBUTE_free| when done. It is also safe, but not necessary, to call
831
+ // |X509_ATTRIBUTE_free| if the result is NULL.
832
+ OPENSSL_EXPORT X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc);
833
+
834
+ // X509_REQ_add1_attr appends a copy of |attr| to |req|'s list of attributes. It
835
+ // returns one on success and zero on error.
836
+ OPENSSL_EXPORT int X509_REQ_add1_attr(X509_REQ *req,
837
+ const X509_ATTRIBUTE *attr);
838
+
839
+ // X509_REQ_add1_attr_by_OBJ appends a new attribute to |req| with type |obj|.
840
+ // It returns one on success and zero on error. The value is determined by
841
+ // |X509_ATTRIBUTE_set1_data|.
842
+ //
843
+ // WARNING: The interpretation of |attrtype|, |data|, and |len| is complex and
844
+ // error-prone. See |X509_ATTRIBUTE_set1_data| for details.
845
+ OPENSSL_EXPORT int X509_REQ_add1_attr_by_OBJ(X509_REQ *req,
846
+ const ASN1_OBJECT *obj,
847
+ int attrtype,
848
+ const unsigned char *data,
849
+ int len);
850
+
851
+ // X509_REQ_add1_attr_by_NID behaves like |X509_REQ_add1_attr_by_OBJ| except the
852
+ // attribute type is determined by |nid|.
853
+ OPENSSL_EXPORT int X509_REQ_add1_attr_by_NID(X509_REQ *req, int nid,
854
+ int attrtype,
855
+ const unsigned char *data,
856
+ int len);
857
+
858
+ // X509_REQ_add1_attr_by_txt behaves like |X509_REQ_add1_attr_by_OBJ| except the
859
+ // attribute type is determined by calling |OBJ_txt2obj| with |attrname|.
860
+ OPENSSL_EXPORT int X509_REQ_add1_attr_by_txt(X509_REQ *req,
861
+ const char *attrname, int attrtype,
862
+ const unsigned char *data,
863
+ int len);
864
+
865
+ // X509_REQ_add_extensions_nid adds an attribute to |req| of type |nid|, to
866
+ // request the certificate extensions in |exts|. It returns one on success and
867
+ // zero on error. |nid| should be |NID_ext_req| or |NID_ms_ext_req|.
868
+ OPENSSL_EXPORT int X509_REQ_add_extensions_nid(
869
+ X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts, int nid);
870
+
871
+ // X509_REQ_add_extensions behaves like |X509_REQ_add_extensions_nid|, using the
872
+ // standard |NID_ext_req| for the attribute type.
873
+ OPENSSL_EXPORT int X509_REQ_add_extensions(
874
+ X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts);
875
+
773
876
  // X509_REQ_sign signs |req| with |pkey| and replaces the signature algorithm
774
- // and signature fields. It returns one on success and zero on error. This
775
- // function uses digest algorithm |md|, or |pkey|'s default if NULL. Other
776
- // signing parameters use |pkey|'s defaults. To customize them, use
777
- // |X509_REQ_sign_ctx|.
877
+ // and signature fields. It returns the length of the signature on success and
878
+ // zero on error. This function uses digest algorithm |md|, or |pkey|'s default
879
+ // if NULL. Other signing parameters use |pkey|'s defaults. To customize them,
880
+ // use |X509_REQ_sign_ctx|.
778
881
  OPENSSL_EXPORT int X509_REQ_sign(X509_REQ *req, EVP_PKEY *pkey,
779
882
  const EVP_MD *md);
780
883
 
781
884
  // X509_REQ_sign_ctx signs |req| with |ctx| and replaces the signature algorithm
782
- // and signature fields. It returns one on success and zero on error. The
783
- // signature algorithm and parameters come from |ctx|, which must have been
784
- // initialized with |EVP_DigestSignInit|. The caller should configure the
785
- // corresponding |EVP_PKEY_CTX| before calling this function.
885
+ // and signature fields. It returns the length of the signature on success and
886
+ // zero on error. The signature algorithm and parameters come from |ctx|, which
887
+ // must have been initialized with |EVP_DigestSignInit|. The caller should
888
+ // configure the corresponding |EVP_PKEY_CTX| before calling this function.
786
889
  OPENSSL_EXPORT int X509_REQ_sign_ctx(X509_REQ *req, EVP_MD_CTX *ctx);
787
890
 
788
891
  // i2d_re_X509_REQ_tbs serializes the CertificationRequestInfo (see RFC 2986)
@@ -940,22 +1043,25 @@ OPENSSL_EXPORT int X509_NAME_add_entry(X509_NAME *name,
940
1043
  // |set| as in |X509_NAME_add_entry|.
941
1044
  OPENSSL_EXPORT int X509_NAME_add_entry_by_OBJ(X509_NAME *name,
942
1045
  const ASN1_OBJECT *obj, int type,
943
- const uint8_t *bytes, int len,
944
- int loc, int set);
1046
+ const uint8_t *bytes,
1047
+ ossl_ssize_t len, int loc,
1048
+ int set);
945
1049
 
946
1050
  // X509_NAME_add_entry_by_NID behaves like |X509_NAME_add_entry_by_OBJ| but sets
947
1051
  // the entry's attribute type to |nid|, which should be one of the |NID_*|
948
1052
  // constants.
949
1053
  OPENSSL_EXPORT int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid,
950
1054
  int type, const uint8_t *bytes,
951
- int len, int loc, int set);
1055
+ ossl_ssize_t len, int loc,
1056
+ int set);
952
1057
 
953
1058
  // X509_NAME_add_entry_by_txt behaves like |X509_NAME_add_entry_by_OBJ| but sets
954
1059
  // the entry's attribute type to |field|, which is passed to |OBJ_txt2obj|.
955
1060
  OPENSSL_EXPORT int X509_NAME_add_entry_by_txt(X509_NAME *name,
956
1061
  const char *field, int type,
957
- const uint8_t *bytes, int len,
958
- int loc, int set);
1062
+ const uint8_t *bytes,
1063
+ ossl_ssize_t len, int loc,
1064
+ int set);
959
1065
 
960
1066
  // X509_NAME_ENTRY is an |ASN1_ITEM| whose ASN.1 type is AttributeTypeAndValue
961
1067
  // (RFC 5280) and C type is |X509_NAME_ENTRY*|.
@@ -1021,7 +1127,8 @@ OPENSSL_EXPORT ASN1_STRING *X509_NAME_ENTRY_get_data(
1021
1127
  // See |ASN1_STRING| for how to format ASN.1 types as an |ASN1_STRING|. If
1022
1128
  // |type| is |V_ASN1_UNDEF| the previous |ASN1_STRING| type is reused.
1023
1129
  OPENSSL_EXPORT int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *entry, int type,
1024
- const uint8_t *bytes, int len);
1130
+ const uint8_t *bytes,
1131
+ ossl_ssize_t len);
1025
1132
 
1026
1133
  // X509_NAME_ENTRY_set returns the zero-based index of the RDN which contains
1027
1134
  // |entry|. Consecutive entries with the same index are part of the same RDN.
@@ -1037,19 +1144,20 @@ OPENSSL_EXPORT int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *entry);
1037
1144
  // object at |*out| instead of allocating a new one.
1038
1145
  OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(
1039
1146
  X509_NAME_ENTRY **out, const ASN1_OBJECT *obj, int type,
1040
- const uint8_t *bytes, int len);
1147
+ const uint8_t *bytes, ossl_ssize_t len);
1041
1148
 
1042
1149
  // X509_NAME_ENTRY_create_by_NID behaves like |X509_NAME_ENTRY_create_by_OBJ|
1043
1150
  // except the attribute type is |nid|, which should be one of the |NID_*|
1044
1151
  // constants.
1045
1152
  OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(
1046
- X509_NAME_ENTRY **out, int nid, int type, const uint8_t *bytes, int len);
1153
+ X509_NAME_ENTRY **out, int nid, int type, const uint8_t *bytes,
1154
+ ossl_ssize_t len);
1047
1155
 
1048
1156
  // X509_NAME_ENTRY_create_by_txt behaves like |X509_NAME_ENTRY_create_by_OBJ|
1049
1157
  // except the attribute type is |field|, which is passed to |OBJ_txt2obj|.
1050
1158
  OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(
1051
1159
  X509_NAME_ENTRY **out, const char *field, int type, const uint8_t *bytes,
1052
- int len);
1160
+ ossl_ssize_t len);
1053
1161
 
1054
1162
 
1055
1163
  // Extensions.
@@ -1291,137 +1399,568 @@ OPENSSL_EXPORT void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
1291
1399
  OPENSSL_EXPORT int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
1292
1400
 
1293
1401
 
1294
- // Printing functions.
1402
+ // Attributes.
1295
1403
  //
1296
- // The following functions output human-readable representations of
1297
- // X.509-related structures. They should only be used for debugging or logging
1298
- // and not parsed programmatically.
1299
-
1300
- // X509_signature_dump writes a human-readable representation of |sig| to |bio|,
1301
- // indented with |indent| spaces. It returns one on success and zero on error.
1302
- OPENSSL_EXPORT int X509_signature_dump(BIO *bio, const ASN1_STRING *sig,
1303
- int indent);
1304
-
1305
- // X509_signature_print writes a human-readable representation of |alg| and
1306
- // |sig| to |bio|. It returns one on success and zero on error.
1307
- OPENSSL_EXPORT int X509_signature_print(BIO *bio, const X509_ALGOR *alg,
1308
- const ASN1_STRING *sig);
1404
+ // Unlike certificates and CRLs, CSRs use a separate Attribute structure (RFC
1405
+ // 2985, RFC 2986) for extensibility. This is represented by the library as
1406
+ // |X509_ATTRIBUTE|.
1309
1407
 
1408
+ DEFINE_STACK_OF(X509_ATTRIBUTE)
1310
1409
 
1311
- // Convenience functions.
1410
+ // X509_ATTRIBUTE is an |ASN1_ITEM| whose ASN.1 type is Attribute (RFC 2986) and
1411
+ // C type is |X509_ATTRIBUTE*|.
1412
+ DECLARE_ASN1_ITEM(X509_ATTRIBUTE)
1312
1413
 
1313
- // X509_pubkey_digest hashes the contents of the BIT STRING in |x509|'s
1314
- // subjectPublicKeyInfo field with |md| and writes the result to |out|.
1315
- // |EVP_MD_CTX_size| bytes are written, which is at most |EVP_MAX_MD_SIZE|. If
1316
- // |out_len| is not NULL, |*out_len| is set to the number of bytes written. This
1317
- // function returns one on success and zero on error.
1318
- //
1319
- // This hash omits the BIT STRING tag, length, and number of unused bits. It
1320
- // also omits the AlgorithmIdentifier which describes the key type. It
1321
- // corresponds to the OCSP KeyHash definition and is not suitable for other
1322
- // purposes.
1323
- OPENSSL_EXPORT int X509_pubkey_digest(const X509 *x509, const EVP_MD *md,
1324
- uint8_t *out, unsigned *out_len);
1414
+ // X509_ATTRIBUTE_new returns a newly-allocated, empty |X509_ATTRIBUTE| object,
1415
+ // or NULL on error. |X509_ATTRIBUTE_set1_*| may be used to finish initializing
1416
+ // it.
1417
+ OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_new(void);
1325
1418
 
1326
- // X509_digest hashes |x509|'s DER encoding with |md| and writes the result to
1327
- // |out|. |EVP_MD_CTX_size| bytes are written, which is at most
1328
- // |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
1329
- // of bytes written. This function returns one on success and zero on error.
1330
- // Note this digest covers the entire certificate, not just the signed portion.
1331
- OPENSSL_EXPORT int X509_digest(const X509 *x509, const EVP_MD *md, uint8_t *out,
1332
- unsigned *out_len);
1419
+ // X509_ATTRIBUTE_dup returns a newly-allocated copy of |attr|, or NULL on
1420
+ // error. This function works by serializing the structure, so if |attr| is
1421
+ // incomplete, it may fail.
1422
+ OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_dup(const X509_ATTRIBUTE *attr);
1333
1423
 
1334
- // X509_CRL_digest hashes |crl|'s DER encoding with |md| and writes the result
1335
- // to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
1336
- // |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
1337
- // of bytes written. This function returns one on success and zero on error.
1338
- // Note this digest covers the entire CRL, not just the signed portion.
1339
- OPENSSL_EXPORT int X509_CRL_digest(const X509_CRL *crl, const EVP_MD *md,
1340
- uint8_t *out, unsigned *out_len);
1424
+ // X509_ATTRIBUTE_free releases memory associated with |attr|.
1425
+ OPENSSL_EXPORT void X509_ATTRIBUTE_free(X509_ATTRIBUTE *attr);
1341
1426
 
1342
- // X509_REQ_digest hashes |req|'s DER encoding with |md| and writes the result
1343
- // to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
1344
- // |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
1345
- // of bytes written. This function returns one on success and zero on error.
1346
- // Note this digest covers the entire certificate request, not just the signed
1347
- // portion.
1348
- OPENSSL_EXPORT int X509_REQ_digest(const X509_REQ *req, const EVP_MD *md,
1349
- uint8_t *out, unsigned *out_len);
1427
+ // d2i_X509_ATTRIBUTE parses up to |len| bytes from |*inp| as a DER-encoded
1428
+ // Attribute (RFC 2986), as described in |d2i_SAMPLE|.
1429
+ OPENSSL_EXPORT X509_ATTRIBUTE *d2i_X509_ATTRIBUTE(X509_ATTRIBUTE **out,
1430
+ const uint8_t **inp,
1431
+ long len);
1350
1432
 
1351
- // X509_NAME_digest hashes |name|'s DER encoding with |md| and writes the result
1352
- // to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
1353
- // |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
1354
- // of bytes written. This function returns one on success and zero on error.
1355
- OPENSSL_EXPORT int X509_NAME_digest(const X509_NAME *name, const EVP_MD *md,
1356
- uint8_t *out, unsigned *out_len);
1433
+ // i2d_X509_ATTRIBUTE marshals |alg| as a DER-encoded Attribute (RFC 2986), as
1434
+ // described in |i2d_SAMPLE|.
1435
+ OPENSSL_EXPORT int i2d_X509_ATTRIBUTE(const X509_ATTRIBUTE *alg,
1436
+ uint8_t **outp);
1357
1437
 
1358
- // The following functions behave like the corresponding unsuffixed |d2i_*|
1359
- // functions, but read the result from |bp| instead. Callers using these
1360
- // functions with memory |BIO|s to parse structures already in memory should use
1361
- // |d2i_*| instead.
1362
- OPENSSL_EXPORT X509 *d2i_X509_bio(BIO *bp, X509 **x509);
1363
- OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl);
1364
- OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req);
1365
- OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa);
1366
- OPENSSL_EXPORT RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa);
1367
- OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa);
1368
- OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa);
1369
- OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa);
1370
- OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey);
1371
- OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey);
1372
- OPENSSL_EXPORT X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8);
1373
- OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(
1374
- BIO *bp, PKCS8_PRIV_KEY_INFO **p8inf);
1375
- OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a);
1376
- OPENSSL_EXPORT DH *d2i_DHparams_bio(BIO *bp, DH **dh);
1438
+ // X509_ATTRIBUTE_create returns a newly-allocated |X509_ATTRIBUTE|, or NULL on
1439
+ // error. The attribute has type |nid| and contains a single value determined by
1440
+ // |attrtype| and |value|, which are interpreted as in |ASN1_TYPE_set|. Note
1441
+ // this function takes ownership of |value|.
1442
+ OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype,
1443
+ void *value);
1377
1444
 
1378
- // d2i_PrivateKey_bio behaves like |d2i_AutoPrivateKey|, but reads from |bp|
1379
- // instead.
1380
- OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a);
1445
+ // X509_ATTRIBUTE_create_by_NID returns a newly-allocated |X509_ATTRIBUTE| of
1446
+ // type |nid|, or NULL on error. The value is determined as in
1447
+ // |X509_ATTRIBUTE_set1_data|.
1448
+ //
1449
+ // If |attr| is non-NULL, the resulting |X509_ATTRIBUTE| is also written to
1450
+ // |*attr|. If |*attr| was non-NULL when the function was called, |*attr| is
1451
+ // reused instead of creating a new object.
1452
+ //
1453
+ // WARNING: The interpretation of |attrtype|, |data|, and |len| is complex and
1454
+ // error-prone. See |X509_ATTRIBUTE_set1_data| for details.
1455
+ //
1456
+ // WARNING: The object reuse form is deprecated and may be removed in the
1457
+ // future. It also currently incorrectly appends to the reused object's value
1458
+ // set rather than overwriting it.
1459
+ OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(
1460
+ X509_ATTRIBUTE **attr, int nid, int attrtype, const void *data, int len);
1381
1461
 
1382
- // The following functions behave like the corresponding unsuffixed |i2d_*|
1383
- // functions, but write the result to |bp|. They return one on success and zero
1384
- // on error. Callers using them with memory |BIO|s to encode structures to
1385
- // memory should use |i2d_*| directly instead.
1386
- OPENSSL_EXPORT int i2d_X509_bio(BIO *bp, X509 *x509);
1387
- OPENSSL_EXPORT int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl);
1388
- OPENSSL_EXPORT int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req);
1389
- OPENSSL_EXPORT int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa);
1390
- OPENSSL_EXPORT int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa);
1391
- OPENSSL_EXPORT int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa);
1392
- OPENSSL_EXPORT int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa);
1393
- OPENSSL_EXPORT int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa);
1394
- OPENSSL_EXPORT int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey);
1395
- OPENSSL_EXPORT int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey);
1396
- OPENSSL_EXPORT int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8);
1397
- OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
1398
- PKCS8_PRIV_KEY_INFO *p8inf);
1399
- OPENSSL_EXPORT int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey);
1400
- OPENSSL_EXPORT int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey);
1401
- OPENSSL_EXPORT int i2d_DHparams_bio(BIO *bp, const DH *dh);
1462
+ // X509_ATTRIBUTE_create_by_OBJ behaves like |X509_ATTRIBUTE_create_by_NID|
1463
+ // except the attribute's type is determined by |obj|.
1464
+ OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(
1465
+ X509_ATTRIBUTE **attr, const ASN1_OBJECT *obj, int attrtype,
1466
+ const void *data, int len);
1402
1467
 
1403
- // i2d_PKCS8PrivateKeyInfo_bio encodes |key| as a PKCS#8 PrivateKeyInfo
1404
- // structure (see |EVP_marshal_private_key|) and writes the result to |bp|. It
1405
- // returns one on success and zero on error.
1406
- OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key);
1468
+ // X509_ATTRIBUTE_create_by_txt behaves like |X509_ATTRIBUTE_create_by_NID|
1469
+ // except the attribute's type is determined by calling |OBJ_txt2obj| with
1470
+ // |attrname|.
1471
+ OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(
1472
+ X509_ATTRIBUTE **attr, const char *attrname, int type,
1473
+ const unsigned char *bytes, int len);
1407
1474
 
1408
- // The following functions behave like the corresponding |d2i_*_bio| functions,
1409
- // but read from |fp| instead.
1410
- OPENSSL_EXPORT X509 *d2i_X509_fp(FILE *fp, X509 **x509);
1411
- OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl);
1412
- OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req);
1413
- OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa);
1414
- OPENSSL_EXPORT RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa);
1415
- OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa);
1416
- OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa);
1417
- OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa);
1418
- OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey);
1419
- OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey);
1420
- OPENSSL_EXPORT X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8);
1421
- OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(
1422
- FILE *fp, PKCS8_PRIV_KEY_INFO **p8inf);
1423
- OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a);
1424
- OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a);
1475
+ // X509_ATTRIBUTE_set1_object sets |attr|'s type to |obj|. It returns one on
1476
+ // success and zero on error.
1477
+ OPENSSL_EXPORT int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr,
1478
+ const ASN1_OBJECT *obj);
1479
+
1480
+ // X509_ATTRIBUTE_set1_data appends a value to |attr|'s value set and returns
1481
+ // one on success or zero on error. The value is determined as follows:
1482
+ //
1483
+ // If |attrtype| is a |MBSTRING_*| constant, the value is an ASN.1 string. The
1484
+ // string is determined by decoding |len| bytes from |data| in the encoding
1485
+ // specified by |attrtype|, and then re-encoding it in a form appropriate for
1486
+ // |attr|'s type. If |len| is -1, |strlen(data)| is used instead. See
1487
+ // |ASN1_STRING_set_by_NID| for details.
1488
+ //
1489
+ // Otherwise, if |len| is not -1, the value is an ASN.1 string. |attrtype| is an
1490
+ // |ASN1_STRING| type value and the |len| bytes from |data| are copied as the
1491
+ // type-specific representation of |ASN1_STRING|. See |ASN1_STRING| for details.
1492
+ //
1493
+ // WARNING: If this form is used to construct a negative INTEGER or ENUMERATED,
1494
+ // |attrtype| includes the |V_ASN1_NEG| flag for |ASN1_STRING|, but the function
1495
+ // forgets to clear the flag for |ASN1_TYPE|. This matches OpenSSL but is
1496
+ // probably a bug. For now, do not use this form with negative values.
1497
+ //
1498
+ // Otherwise, if |len| is -1, the value is constructed by passing |attrtype| and
1499
+ // |data| to |ASN1_TYPE_set1|. That is, |attrtype| is an |ASN1_TYPE| type value,
1500
+ // and |data| is cast to the corresponding pointer type.
1501
+ //
1502
+ // WARNING: Despite the name, this function appends to |attr|'s value set,
1503
+ // rather than overwriting it. To overwrite the value set, create a new
1504
+ // |X509_ATTRIBUTE| with |X509_ATTRIBUTE_new|.
1505
+ //
1506
+ // WARNING: If using the |MBSTRING_*| form, pass a length rather than relying on
1507
+ // |strlen|. In particular, |strlen| will not behave correctly if the input is
1508
+ // |MBSTRING_BMP| or |MBSTRING_UNIV|.
1509
+ //
1510
+ // WARNING: This function currently misinterprets |V_ASN1_OTHER| as an
1511
+ // |MBSTRING_*| constant. This matches OpenSSL but means it is impossible to
1512
+ // construct a value with a non-universal tag.
1513
+ OPENSSL_EXPORT int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype,
1514
+ const void *data, int len);
1515
+
1516
+ // X509_ATTRIBUTE_get0_data returns the |idx|th value of |attr| in a
1517
+ // type-specific representation to |attrtype|, or NULL if out of bounds or the
1518
+ // type does not match. |attrtype| is one of the type values in |ASN1_TYPE|. On
1519
+ // match, the return value uses the same representation as |ASN1_TYPE_set0|. See
1520
+ // |ASN1_TYPE| for details.
1521
+ OPENSSL_EXPORT void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx,
1522
+ int attrtype, void *unused);
1523
+
1524
+ // X509_ATTRIBUTE_count returns the number of values in |attr|.
1525
+ OPENSSL_EXPORT int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr);
1526
+
1527
+ // X509_ATTRIBUTE_get0_object returns the type of |attr|.
1528
+ OPENSSL_EXPORT ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr);
1529
+
1530
+ // X509_ATTRIBUTE_get0_type returns the |idx|th value in |attr|, or NULL if out
1531
+ // of bounds. Note this function returns one of |attr|'s values, not the type.
1532
+ OPENSSL_EXPORT ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr,
1533
+ int idx);
1534
+
1535
+
1536
+ // SignedPublicKeyAndChallenge structures.
1537
+ //
1538
+ // The SignedPublicKeyAndChallenge (SPKAC) is a legacy structure to request
1539
+ // certificates, primarily in the legacy <keygen> HTML tag. An SPKAC structure
1540
+ // is represented by a |NETSCAPE_SPKI| structure.
1541
+ //
1542
+ // The structure is described in
1543
+ // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/keygen
1544
+
1545
+ // A Netscape_spki_st, or |NETSCAPE_SPKI|, represents a
1546
+ // SignedPublicKeyAndChallenge structure. Although this structure contains a
1547
+ // |spkac| field of type |NETSCAPE_SPKAC|, these are misnamed. The SPKAC is the
1548
+ // entire structure, not the signed portion.
1549
+ struct Netscape_spki_st {
1550
+ NETSCAPE_SPKAC *spkac;
1551
+ X509_ALGOR *sig_algor;
1552
+ ASN1_BIT_STRING *signature;
1553
+ } /* NETSCAPE_SPKI */;
1554
+
1555
+ // NETSCAPE_SPKI is an |ASN1_ITEM| whose ASN.1 type is
1556
+ // SignedPublicKeyAndChallenge and C type is |NETSCAPE_SPKI*|.
1557
+ DECLARE_ASN1_ITEM(NETSCAPE_SPKI)
1558
+
1559
+ // NETSCAPE_SPKI_new returns a newly-allocated, empty |NETSCAPE_SPKI| object, or
1560
+ // NULL on error.
1561
+ OPENSSL_EXPORT NETSCAPE_SPKI *NETSCAPE_SPKI_new(void);
1562
+
1563
+ // NETSCAPE_SPKI_free releases memory associated with |spki|.
1564
+ OPENSSL_EXPORT void NETSCAPE_SPKI_free(NETSCAPE_SPKI *spki);
1565
+
1566
+ // d2i_NETSCAPE_SPKI parses up to |len| bytes from |*inp| as a DER-encoded
1567
+ // SignedPublicKeyAndChallenge structure, as described in |d2i_SAMPLE|.
1568
+ OPENSSL_EXPORT NETSCAPE_SPKI *d2i_NETSCAPE_SPKI(NETSCAPE_SPKI **out,
1569
+ const uint8_t **inp, long len);
1570
+
1571
+ // i2d_NETSCAPE_SPKI marshals |spki| as a DER-encoded
1572
+ // SignedPublicKeyAndChallenge structure, as described in |i2d_SAMPLE|.
1573
+ OPENSSL_EXPORT int i2d_NETSCAPE_SPKI(const NETSCAPE_SPKI *spki, uint8_t **outp);
1574
+
1575
+ // NETSCAPE_SPKI_verify checks that |spki| has a valid signature by |pkey|. It
1576
+ // returns one if the signature is valid and zero otherwise.
1577
+ OPENSSL_EXPORT int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *spki, EVP_PKEY *pkey);
1578
+
1579
+ // NETSCAPE_SPKI_b64_decode decodes |len| bytes from |str| as a base64-encoded
1580
+ // SignedPublicKeyAndChallenge structure. It returns a newly-allocated
1581
+ // |NETSCAPE_SPKI| structure with the result, or NULL on error. If |len| is 0 or
1582
+ // negative, the length is calculated with |strlen| and |str| must be a
1583
+ // NUL-terminated C string.
1584
+ OPENSSL_EXPORT NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str,
1585
+ ossl_ssize_t len);
1586
+
1587
+ // NETSCAPE_SPKI_b64_encode encodes |spki| as a base64-encoded
1588
+ // SignedPublicKeyAndChallenge structure. It returns a newly-allocated
1589
+ // NUL-terminated C string with the result, or NULL on error. The caller must
1590
+ // release the memory with |OPENSSL_free| when done.
1591
+ OPENSSL_EXPORT char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki);
1592
+
1593
+ // NETSCAPE_SPKI_get_pubkey decodes and returns the public key in |spki| as an
1594
+ // |EVP_PKEY|, or NULL on error. The caller takes ownership of the resulting
1595
+ // pointer and must call |EVP_PKEY_free| when done.
1596
+ OPENSSL_EXPORT EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *spki);
1597
+
1598
+ // NETSCAPE_SPKI_set_pubkey sets |spki|'s public key to |pkey|. It returns one
1599
+ // on success or zero on error. This function does not take ownership of |pkey|,
1600
+ // so the caller may continue to manage its lifetime independently of |spki|.
1601
+ OPENSSL_EXPORT int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *spki,
1602
+ EVP_PKEY *pkey);
1603
+
1604
+ // NETSCAPE_SPKI_sign signs |spki| with |pkey| and replaces the signature
1605
+ // algorithm and signature fields. It returns the length of the signature on
1606
+ // success and zero on error. This function uses digest algorithm |md|, or
1607
+ // |pkey|'s default if NULL. Other signing parameters use |pkey|'s defaults.
1608
+ OPENSSL_EXPORT int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *spki, EVP_PKEY *pkey,
1609
+ const EVP_MD *md);
1610
+
1611
+ // A Netscape_spkac_st, or |NETSCAPE_SPKAC|, represents a PublicKeyAndChallenge
1612
+ // structure. This type is misnamed. The full SPKAC includes the signature,
1613
+ // which is represented with the |NETSCAPE_SPKI| type.
1614
+ struct Netscape_spkac_st {
1615
+ X509_PUBKEY *pubkey;
1616
+ ASN1_IA5STRING *challenge;
1617
+ } /* NETSCAPE_SPKAC */;
1618
+
1619
+ // NETSCAPE_SPKAC is an |ASN1_ITEM| whose ASN.1 type is PublicKeyAndChallenge
1620
+ // and C type is |NETSCAPE_SPKAC*|.
1621
+ DECLARE_ASN1_ITEM(NETSCAPE_SPKAC)
1622
+
1623
+ // NETSCAPE_SPKAC_new returns a newly-allocated, empty |NETSCAPE_SPKAC| object,
1624
+ // or NULL on error.
1625
+ OPENSSL_EXPORT NETSCAPE_SPKAC *NETSCAPE_SPKAC_new(void);
1626
+
1627
+ // NETSCAPE_SPKAC_free releases memory associated with |spkac|.
1628
+ OPENSSL_EXPORT void NETSCAPE_SPKAC_free(NETSCAPE_SPKAC *spkac);
1629
+
1630
+ // d2i_NETSCAPE_SPKAC parses up to |len| bytes from |*inp| as a DER-encoded
1631
+ // PublicKeyAndChallenge structure, as described in |d2i_SAMPLE|.
1632
+ OPENSSL_EXPORT NETSCAPE_SPKAC *d2i_NETSCAPE_SPKAC(NETSCAPE_SPKAC **out,
1633
+ const uint8_t **inp,
1634
+ long len);
1635
+
1636
+ // i2d_NETSCAPE_SPKAC marshals |spkac| as a DER-encoded PublicKeyAndChallenge
1637
+ // structure, as described in |i2d_SAMPLE|.
1638
+ OPENSSL_EXPORT int i2d_NETSCAPE_SPKAC(const NETSCAPE_SPKAC *spkac,
1639
+ uint8_t **outp);
1640
+
1641
+
1642
+ // Printing functions.
1643
+ //
1644
+ // The following functions output human-readable representations of
1645
+ // X.509-related structures. They should only be used for debugging or logging
1646
+ // and not parsed programmatically. In many cases, the outputs are ambiguous, so
1647
+ // attempting to parse them can lead to string injection vulnerabilities.
1648
+
1649
+ // The following flags control |X509_print_ex| and |X509_REQ_print_ex|.
1650
+
1651
+ // X509_FLAG_COMPAT disables all flags. It additionally causes names to be
1652
+ // printed with a 16-byte indent.
1653
+ #define X509_FLAG_COMPAT 0
1654
+
1655
+ // X509_FLAG_NO_HEADER skips a header identifying the type of object printed.
1656
+ #define X509_FLAG_NO_HEADER 1L
1657
+
1658
+ // X509_FLAG_NO_VERSION skips printing the X.509 version number.
1659
+ #define X509_FLAG_NO_VERSION (1L << 1)
1660
+
1661
+ // X509_FLAG_NO_SERIAL skips printing the serial number. It is ignored in
1662
+ // |X509_REQ_print_fp|.
1663
+ #define X509_FLAG_NO_SERIAL (1L << 2)
1664
+
1665
+ // X509_FLAG_NO_SIGNAME skips printing the signature algorithm in the
1666
+ // TBSCertificate. It is ignored in |X509_REQ_print_fp|.
1667
+ #define X509_FLAG_NO_SIGNAME (1L << 3)
1668
+
1669
+ // X509_FLAG_NO_ISSUER skips printing the issuer.
1670
+ #define X509_FLAG_NO_ISSUER (1L << 4)
1671
+
1672
+ // X509_FLAG_NO_VALIDITY skips printing the notBefore and notAfter times. It is
1673
+ // ignored in |X509_REQ_print_fp|.
1674
+ #define X509_FLAG_NO_VALIDITY (1L << 5)
1675
+
1676
+ // X509_FLAG_NO_SUBJECT skips printing the subject.
1677
+ #define X509_FLAG_NO_SUBJECT (1L << 6)
1678
+
1679
+ // X509_FLAG_NO_PUBKEY skips printing the public key.
1680
+ #define X509_FLAG_NO_PUBKEY (1L << 7)
1681
+
1682
+ // X509_FLAG_NO_EXTENSIONS skips printing the extension list. It is ignored in
1683
+ // |X509_REQ_print_fp|. CSRs instead have attributes, which is controlled by
1684
+ // |X509_FLAG_NO_ATTRIBUTES|.
1685
+ #define X509_FLAG_NO_EXTENSIONS (1L << 8)
1686
+
1687
+ // X509_FLAG_NO_SIGDUMP skips printing the signature and outer signature
1688
+ // algorithm.
1689
+ #define X509_FLAG_NO_SIGDUMP (1L << 9)
1690
+
1691
+ // X509_FLAG_NO_AUX skips printing auxiliary properties. (See |d2i_X509_AUX| and
1692
+ // related functions.)
1693
+ #define X509_FLAG_NO_AUX (1L << 10)
1694
+
1695
+ // X509_FLAG_NO_ATTRIBUTES skips printing CSR attributes. It does nothing for
1696
+ // certificates and CRLs.
1697
+ #define X509_FLAG_NO_ATTRIBUTES (1L << 11)
1698
+
1699
+ // X509_FLAG_NO_IDS skips printing the issuerUniqueID and subjectUniqueID in a
1700
+ // certificate. It is ignored in |X509_REQ_print_fp|.
1701
+ #define X509_FLAG_NO_IDS (1L << 12)
1702
+
1703
+ // X509_print_ex writes a human-readable representation of |x| to |bp|. It
1704
+ // returns one on success and zero on error. |nmflags| is the flags parameter
1705
+ // for |X509_NAME_print_ex| when printing the subject and issuer. |cflag| should
1706
+ // be some combination of the |X509_FLAG_*| constants.
1707
+ OPENSSL_EXPORT int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag,
1708
+ unsigned long cflag);
1709
+
1710
+ // X509_print_ex_fp behaves like |X509_print_ex| but writes to |fp|.
1711
+ OPENSSL_EXPORT int X509_print_ex_fp(FILE *fp, X509 *x, unsigned long nmflag,
1712
+ unsigned long cflag);
1713
+
1714
+ // X509_print calls |X509_print_ex| with |XN_FLAG_COMPAT| and |X509_FLAG_COMPAT|
1715
+ // flags.
1716
+ OPENSSL_EXPORT int X509_print(BIO *bp, X509 *x);
1717
+
1718
+ // X509_print_fp behaves like |X509_print| but writes to |fp|.
1719
+ OPENSSL_EXPORT int X509_print_fp(FILE *fp, X509 *x);
1720
+
1721
+ // X509_CRL_print writes a human-readable representation of |x| to |bp|. It
1722
+ // returns one on success and zero on error.
1723
+ OPENSSL_EXPORT int X509_CRL_print(BIO *bp, X509_CRL *x);
1724
+
1725
+ // X509_CRL_print_fp behaves like |X509_CRL_print| but writes to |fp|.
1726
+ OPENSSL_EXPORT int X509_CRL_print_fp(FILE *fp, X509_CRL *x);
1727
+
1728
+ // X509_REQ_print_ex writes a human-readable representation of |x| to |bp|. It
1729
+ // returns one on success and zero on error. |nmflags| is the flags parameter
1730
+ // for |X509_NAME_print_ex|, when printing the subject. |cflag| should be some
1731
+ // combination of the |X509_FLAG_*| constants.
1732
+ OPENSSL_EXPORT int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag,
1733
+ unsigned long cflag);
1734
+
1735
+ // X509_REQ_print calls |X509_REQ_print_ex| with |XN_FLAG_COMPAT| and
1736
+ // |X509_FLAG_COMPAT| flags.
1737
+ OPENSSL_EXPORT int X509_REQ_print(BIO *bp, X509_REQ *req);
1738
+
1739
+ // X509_REQ_print_fp behaves like |X509_REQ_print| but writes to |fp|.
1740
+ OPENSSL_EXPORT int X509_REQ_print_fp(FILE *fp, X509_REQ *req);
1741
+
1742
+ // The following flags are control |X509_NAME_print_ex|. They must not collide
1743
+ // with |ASN1_STRFLGS_*|.
1744
+ //
1745
+ // TODO(davidben): This is far, far too many options and most of them are
1746
+ // useless. Trim this down.
1747
+
1748
+ // XN_FLAG_COMPAT prints with |X509_NAME_print|'s format and return value
1749
+ // convention.
1750
+ #define XN_FLAG_COMPAT 0
1751
+
1752
+ // XN_FLAG_SEP_MASK determines the separators to use between attributes.
1753
+ #define XN_FLAG_SEP_MASK (0xf << 16)
1754
+
1755
+ // XN_FLAG_SEP_COMMA_PLUS separates RDNs with "," and attributes within an RDN
1756
+ // with "+", as in RFC 2253.
1757
+ #define XN_FLAG_SEP_COMMA_PLUS (1 << 16)
1758
+
1759
+ // XN_FLAG_SEP_CPLUS_SPC behaves like |XN_FLAG_SEP_COMMA_PLUS| but adds spaces
1760
+ // between the separators.
1761
+ #define XN_FLAG_SEP_CPLUS_SPC (2 << 16)
1762
+
1763
+ // XN_FLAG_SEP_SPLUS_SPC separates RDNs with "; " and attributes within an RDN
1764
+ // with " + ".
1765
+ #define XN_FLAG_SEP_SPLUS_SPC (3 << 16)
1766
+
1767
+ // XN_FLAG_SEP_MULTILINE prints each attribute on one line.
1768
+ #define XN_FLAG_SEP_MULTILINE (4 << 16)
1769
+
1770
+ // XN_FLAG_DN_REV prints RDNs in reverse, from least significant to most
1771
+ // significant, as RFC 2253.
1772
+ #define XN_FLAG_DN_REV (1 << 20)
1773
+
1774
+ // XN_FLAG_FN_MASK determines how attribute types are displayed.
1775
+ #define XN_FLAG_FN_MASK (0x3 << 21)
1776
+
1777
+ // XN_FLAG_FN_SN uses the attribute type's short name, when available.
1778
+ #define XN_FLAG_FN_SN 0
1779
+
1780
+ // XN_FLAG_SPC_EQ wraps the "=" operator with spaces when printing attributes.
1781
+ #define XN_FLAG_SPC_EQ (1 << 23)
1782
+
1783
+ // XN_FLAG_DUMP_UNKNOWN_FIELDS causes unknown attribute types to be printed in
1784
+ // hex, as in RFC 2253.
1785
+ #define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24)
1786
+
1787
+ // XN_FLAG_RFC2253 prints like RFC 2253.
1788
+ #define XN_FLAG_RFC2253 \
1789
+ (ASN1_STRFLGS_RFC2253 | XN_FLAG_SEP_COMMA_PLUS | XN_FLAG_DN_REV | \
1790
+ XN_FLAG_FN_SN | XN_FLAG_DUMP_UNKNOWN_FIELDS)
1791
+
1792
+ // XN_FLAG_ONELINE prints a one-line representation of the name.
1793
+ #define XN_FLAG_ONELINE \
1794
+ (ASN1_STRFLGS_RFC2253 | ASN1_STRFLGS_ESC_QUOTE | XN_FLAG_SEP_CPLUS_SPC | \
1795
+ XN_FLAG_SPC_EQ | XN_FLAG_FN_SN)
1796
+
1797
+ // X509_NAME_print_ex writes a human-readable representation of |nm| to |out|.
1798
+ // Each line of output is indented by |indent| spaces. It returns the number of
1799
+ // bytes written on success, and -1 on error. If |out| is NULL, it returns the
1800
+ // number of bytes it would have written but does not write anything. |flags|
1801
+ // should be some combination of |XN_FLAG_*| and |ASN1_STRFLGS_*| values and
1802
+ // determines the output. If unsure, use |XN_FLAG_RFC2253|.
1803
+ //
1804
+ // If |flags| is |XN_FLAG_COMPAT|, or zero, this function calls
1805
+ // |X509_NAME_print| instead. In that case, it returns one on success, rather
1806
+ // than the output length.
1807
+ OPENSSL_EXPORT int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent,
1808
+ unsigned long flags);
1809
+
1810
+ // X509_NAME_print prints a human-readable representation of |name| to |bp|. It
1811
+ // returns one on success and zero on error. |obase| is ignored.
1812
+ //
1813
+ // This function outputs a legacy format that does not correctly handle string
1814
+ // encodings and other cases. Prefer |X509_NAME_print_ex| if printing a name for
1815
+ // debugging purposes.
1816
+ OPENSSL_EXPORT int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase);
1817
+
1818
+ // X509_NAME_oneline writes a human-readable representation to |name| to a
1819
+ // buffer as a NUL-terminated C string.
1820
+ //
1821
+ // If |buf| is NULL, returns a newly-allocated buffer containing the result on
1822
+ // success, or NULL on error. The buffer must be released with |OPENSSL_free|
1823
+ // when done.
1824
+ //
1825
+ // If |buf| is non-NULL, at most |size| bytes of output are written to |buf|
1826
+ // instead. |size| includes the trailing NUL. The function then returns |buf| on
1827
+ // success or NULL on error. If the output does not fit in |size| bytes, the
1828
+ // output is silently truncated at an attribute boundary.
1829
+ //
1830
+ // This function outputs a legacy format that does not correctly handle string
1831
+ // encodings and other cases. Prefer |X509_NAME_print_ex| if printing a name for
1832
+ // debugging purposes.
1833
+ OPENSSL_EXPORT char *X509_NAME_oneline(const X509_NAME *name, char *buf, int size);
1834
+
1835
+ // X509_NAME_print_ex_fp behaves like |X509_NAME_print_ex| but writes to |fp|.
1836
+ OPENSSL_EXPORT int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm,
1837
+ int indent, unsigned long flags);
1838
+
1839
+ // X509_signature_dump writes a human-readable representation of |sig| to |bio|,
1840
+ // indented with |indent| spaces. It returns one on success and zero on error.
1841
+ OPENSSL_EXPORT int X509_signature_dump(BIO *bio, const ASN1_STRING *sig,
1842
+ int indent);
1843
+
1844
+ // X509_signature_print writes a human-readable representation of |alg| and
1845
+ // |sig| to |bio|. It returns one on success and zero on error.
1846
+ OPENSSL_EXPORT int X509_signature_print(BIO *bio, const X509_ALGOR *alg,
1847
+ const ASN1_STRING *sig);
1848
+
1849
+
1850
+ // Convenience functions.
1851
+
1852
+ // X509_pubkey_digest hashes the contents of the BIT STRING in |x509|'s
1853
+ // subjectPublicKeyInfo field with |md| and writes the result to |out|.
1854
+ // |EVP_MD_CTX_size| bytes are written, which is at most |EVP_MAX_MD_SIZE|. If
1855
+ // |out_len| is not NULL, |*out_len| is set to the number of bytes written. This
1856
+ // function returns one on success and zero on error.
1857
+ //
1858
+ // This hash omits the BIT STRING tag, length, and number of unused bits. It
1859
+ // also omits the AlgorithmIdentifier which describes the key type. It
1860
+ // corresponds to the OCSP KeyHash definition and is not suitable for other
1861
+ // purposes.
1862
+ OPENSSL_EXPORT int X509_pubkey_digest(const X509 *x509, const EVP_MD *md,
1863
+ uint8_t *out, unsigned *out_len);
1864
+
1865
+ // X509_digest hashes |x509|'s DER encoding with |md| and writes the result to
1866
+ // |out|. |EVP_MD_CTX_size| bytes are written, which is at most
1867
+ // |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
1868
+ // of bytes written. This function returns one on success and zero on error.
1869
+ // Note this digest covers the entire certificate, not just the signed portion.
1870
+ OPENSSL_EXPORT int X509_digest(const X509 *x509, const EVP_MD *md, uint8_t *out,
1871
+ unsigned *out_len);
1872
+
1873
+ // X509_CRL_digest hashes |crl|'s DER encoding with |md| and writes the result
1874
+ // to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
1875
+ // |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
1876
+ // of bytes written. This function returns one on success and zero on error.
1877
+ // Note this digest covers the entire CRL, not just the signed portion.
1878
+ OPENSSL_EXPORT int X509_CRL_digest(const X509_CRL *crl, const EVP_MD *md,
1879
+ uint8_t *out, unsigned *out_len);
1880
+
1881
+ // X509_REQ_digest hashes |req|'s DER encoding with |md| and writes the result
1882
+ // to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
1883
+ // |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
1884
+ // of bytes written. This function returns one on success and zero on error.
1885
+ // Note this digest covers the entire certificate request, not just the signed
1886
+ // portion.
1887
+ OPENSSL_EXPORT int X509_REQ_digest(const X509_REQ *req, const EVP_MD *md,
1888
+ uint8_t *out, unsigned *out_len);
1889
+
1890
+ // X509_NAME_digest hashes |name|'s DER encoding with |md| and writes the result
1891
+ // to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
1892
+ // |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
1893
+ // of bytes written. This function returns one on success and zero on error.
1894
+ OPENSSL_EXPORT int X509_NAME_digest(const X509_NAME *name, const EVP_MD *md,
1895
+ uint8_t *out, unsigned *out_len);
1896
+
1897
+ // The following functions behave like the corresponding unsuffixed |d2i_*|
1898
+ // functions, but read the result from |bp| instead. Callers using these
1899
+ // functions with memory |BIO|s to parse structures already in memory should use
1900
+ // |d2i_*| instead.
1901
+ OPENSSL_EXPORT X509 *d2i_X509_bio(BIO *bp, X509 **x509);
1902
+ OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl);
1903
+ OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req);
1904
+ OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa);
1905
+ OPENSSL_EXPORT RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa);
1906
+ OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa);
1907
+ OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa);
1908
+ OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa);
1909
+ OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey);
1910
+ OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey);
1911
+ OPENSSL_EXPORT X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8);
1912
+ OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(
1913
+ BIO *bp, PKCS8_PRIV_KEY_INFO **p8inf);
1914
+ OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a);
1915
+ OPENSSL_EXPORT DH *d2i_DHparams_bio(BIO *bp, DH **dh);
1916
+
1917
+ // d2i_PrivateKey_bio behaves like |d2i_AutoPrivateKey|, but reads from |bp|
1918
+ // instead.
1919
+ OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a);
1920
+
1921
+ // The following functions behave like the corresponding unsuffixed |i2d_*|
1922
+ // functions, but write the result to |bp|. They return one on success and zero
1923
+ // on error. Callers using them with memory |BIO|s to encode structures to
1924
+ // memory should use |i2d_*| directly instead.
1925
+ OPENSSL_EXPORT int i2d_X509_bio(BIO *bp, X509 *x509);
1926
+ OPENSSL_EXPORT int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl);
1927
+ OPENSSL_EXPORT int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req);
1928
+ OPENSSL_EXPORT int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa);
1929
+ OPENSSL_EXPORT int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa);
1930
+ OPENSSL_EXPORT int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa);
1931
+ OPENSSL_EXPORT int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa);
1932
+ OPENSSL_EXPORT int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa);
1933
+ OPENSSL_EXPORT int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey);
1934
+ OPENSSL_EXPORT int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey);
1935
+ OPENSSL_EXPORT int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8);
1936
+ OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
1937
+ PKCS8_PRIV_KEY_INFO *p8inf);
1938
+ OPENSSL_EXPORT int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey);
1939
+ OPENSSL_EXPORT int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey);
1940
+ OPENSSL_EXPORT int i2d_DHparams_bio(BIO *bp, const DH *dh);
1941
+
1942
+ // i2d_PKCS8PrivateKeyInfo_bio encodes |key| as a PKCS#8 PrivateKeyInfo
1943
+ // structure (see |EVP_marshal_private_key|) and writes the result to |bp|. It
1944
+ // returns one on success and zero on error.
1945
+ OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key);
1946
+
1947
+ // The following functions behave like the corresponding |d2i_*_bio| functions,
1948
+ // but read from |fp| instead.
1949
+ OPENSSL_EXPORT X509 *d2i_X509_fp(FILE *fp, X509 **x509);
1950
+ OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl);
1951
+ OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req);
1952
+ OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa);
1953
+ OPENSSL_EXPORT RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa);
1954
+ OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa);
1955
+ OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa);
1956
+ OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa);
1957
+ OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey);
1958
+ OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey);
1959
+ OPENSSL_EXPORT X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8);
1960
+ OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(
1961
+ FILE *fp, PKCS8_PRIV_KEY_INFO **p8inf);
1962
+ OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a);
1963
+ OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a);
1425
1964
 
1426
1965
  // The following functions behave like the corresponding |i2d_*_bio| functions,
1427
1966
  // but write to |fp| instead.
@@ -1454,6 +1993,39 @@ OPENSSL_EXPORT X509 *X509_find_by_issuer_and_serial(const STACK_OF(X509) *sk,
1454
1993
  OPENSSL_EXPORT X509 *X509_find_by_subject(const STACK_OF(X509) *sk,
1455
1994
  X509_NAME *name);
1456
1995
 
1996
+ // X509_cmp_time compares |s| against |*t|. On success, it returns a negative
1997
+ // number if |s| <= |*t| and a positive number if |s| > |*t|. On error, it
1998
+ // returns zero. If |t| is NULL, it uses the current time instead of |*t|.
1999
+ //
2000
+ // WARNING: Unlike most comparison functions, this function returns zero on
2001
+ // error, not equality.
2002
+ OPENSSL_EXPORT int X509_cmp_time(const ASN1_TIME *s, time_t *t);
2003
+
2004
+ // X509_cmp_time_posix compares |s| against |t|. On success, it returns a
2005
+ // negative number if |s| <= |t| and a positive number if |s| > |t|. On error,
2006
+ // it returns zero.
2007
+ //
2008
+ // WARNING: Unlike most comparison functions, this function returns zero on
2009
+ // error, not equality.
2010
+ OPENSSL_EXPORT int X509_cmp_time_posix(const ASN1_TIME *s, int64_t t);
2011
+
2012
+ // X509_cmp_current_time behaves like |X509_cmp_time| but compares |s| against
2013
+ // the current time.
2014
+ OPENSSL_EXPORT int X509_cmp_current_time(const ASN1_TIME *s);
2015
+
2016
+ // X509_time_adj calls |X509_time_adj_ex| with |offset_day| equal to zero.
2017
+ OPENSSL_EXPORT ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec,
2018
+ time_t *t);
2019
+
2020
+ // X509_time_adj_ex behaves like |ASN1_TIME_adj|, but adds an offset to |*t|. If
2021
+ // |t| is NULL, it uses the current time instead of |*t|.
2022
+ OPENSSL_EXPORT ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, int offset_day,
2023
+ long offset_sec, time_t *t);
2024
+
2025
+ // X509_gmtime_adj behaves like |X509_time_adj_ex| but adds |offset_sec| to the
2026
+ // current time.
2027
+ OPENSSL_EXPORT ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long offset_sec);
2028
+
1457
2029
 
1458
2030
  // ex_data functions.
1459
2031
  //
@@ -1575,8 +2147,6 @@ struct X509_algor_st {
1575
2147
  #define X509v3_KU_DECIPHER_ONLY 0x8000
1576
2148
  #define X509v3_KU_UNDEF 0xffff
1577
2149
 
1578
- DEFINE_STACK_OF(X509_ATTRIBUTE)
1579
-
1580
2150
  // This stuff is certificate "auxiliary info"
1581
2151
  // it contains details which are useful in certificate
1582
2152
  // stores and databases. When used this is tagged onto
@@ -1626,74 +2196,6 @@ DEFINE_STACK_OF(X509_TRUST)
1626
2196
  #define X509_TRUST_REJECTED 2
1627
2197
  #define X509_TRUST_UNTRUSTED 3
1628
2198
 
1629
- // Flags for X509_print_ex()
1630
-
1631
- #define X509_FLAG_COMPAT 0
1632
- #define X509_FLAG_NO_HEADER 1L
1633
- #define X509_FLAG_NO_VERSION (1L << 1)
1634
- #define X509_FLAG_NO_SERIAL (1L << 2)
1635
- #define X509_FLAG_NO_SIGNAME (1L << 3)
1636
- #define X509_FLAG_NO_ISSUER (1L << 4)
1637
- #define X509_FLAG_NO_VALIDITY (1L << 5)
1638
- #define X509_FLAG_NO_SUBJECT (1L << 6)
1639
- #define X509_FLAG_NO_PUBKEY (1L << 7)
1640
- #define X509_FLAG_NO_EXTENSIONS (1L << 8)
1641
- #define X509_FLAG_NO_SIGDUMP (1L << 9)
1642
- #define X509_FLAG_NO_AUX (1L << 10)
1643
- #define X509_FLAG_NO_ATTRIBUTES (1L << 11)
1644
- #define X509_FLAG_NO_IDS (1L << 12)
1645
-
1646
- // Flags specific to X509_NAME_print_ex(). These flags must not collide with
1647
- // |ASN1_STRFLGS_*|.
1648
-
1649
- // The field separator information
1650
-
1651
- #define XN_FLAG_SEP_MASK (0xf << 16)
1652
-
1653
- #define XN_FLAG_COMPAT 0 // Traditional SSLeay: use old X509_NAME_print
1654
- #define XN_FLAG_SEP_COMMA_PLUS (1 << 16) // RFC 2253 ,+
1655
- #define XN_FLAG_SEP_CPLUS_SPC (2 << 16) // ,+ spaced: more readable
1656
- #define XN_FLAG_SEP_SPLUS_SPC (3 << 16) // ;+ spaced
1657
- #define XN_FLAG_SEP_MULTILINE (4 << 16) // One line per field
1658
-
1659
- #define XN_FLAG_DN_REV (1 << 20) // Reverse DN order
1660
-
1661
- // How the field name is shown
1662
-
1663
- #define XN_FLAG_FN_MASK (0x3 << 21)
1664
-
1665
- #define XN_FLAG_FN_SN 0 // Object short name
1666
- #define XN_FLAG_FN_LN (1 << 21) // Object long name
1667
- #define XN_FLAG_FN_OID (2 << 21) // Always use OIDs
1668
- #define XN_FLAG_FN_NONE (3 << 21) // No field names
1669
-
1670
- #define XN_FLAG_SPC_EQ (1 << 23) // Put spaces round '='
1671
-
1672
- // This determines if we dump fields we don't recognise:
1673
- // RFC 2253 requires this.
1674
-
1675
- #define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24)
1676
-
1677
- #define XN_FLAG_FN_ALIGN (1 << 25) // Align field names to 20 characters
1678
-
1679
- // Complete set of RFC 2253 flags
1680
-
1681
- #define XN_FLAG_RFC2253 \
1682
- (ASN1_STRFLGS_RFC2253 | XN_FLAG_SEP_COMMA_PLUS | XN_FLAG_DN_REV | \
1683
- XN_FLAG_FN_SN | XN_FLAG_DUMP_UNKNOWN_FIELDS)
1684
-
1685
- // readable oneline form
1686
-
1687
- #define XN_FLAG_ONELINE \
1688
- (ASN1_STRFLGS_RFC2253 | ASN1_STRFLGS_ESC_QUOTE | XN_FLAG_SEP_CPLUS_SPC | \
1689
- XN_FLAG_SPC_EQ | XN_FLAG_FN_SN)
1690
-
1691
- // readable multiline form
1692
-
1693
- #define XN_FLAG_MULTILINE \
1694
- (ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB | XN_FLAG_SEP_MULTILINE | \
1695
- XN_FLAG_SPC_EQ | XN_FLAG_FN_LN | XN_FLAG_FN_ALIGN)
1696
-
1697
2199
  DEFINE_STACK_OF(X509_REVOKED)
1698
2200
 
1699
2201
  DECLARE_STACK_OF(GENERAL_NAMES)
@@ -1729,137 +2231,35 @@ struct X509_info_st {
1729
2231
 
1730
2232
  DEFINE_STACK_OF(X509_INFO)
1731
2233
 
1732
- // The next 2 structures and their 8 routines were sent to me by
1733
- // Pat Richard <patr@x509.com> and are used to manipulate
1734
- // Netscapes spki structures - useful if you are writing a CA web page
1735
- struct Netscape_spkac_st {
1736
- X509_PUBKEY *pubkey;
1737
- ASN1_IA5STRING *challenge; // challenge sent in atlas >= PR2
1738
- } /* NETSCAPE_SPKAC */;
1739
-
1740
- struct Netscape_spki_st {
1741
- NETSCAPE_SPKAC *spkac; // signed public key and challenge
1742
- X509_ALGOR *sig_algor;
1743
- ASN1_BIT_STRING *signature;
1744
- } /* NETSCAPE_SPKI */;
1745
-
1746
- // X509_get_pathlen returns path length constraint from the basic constraints
1747
- // extension in |x509|. (See RFC 5280, section 4.2.1.9.) It returns -1 if the
1748
- // constraint is not present, or if some extension in |x509| was invalid.
1749
- //
1750
- // Note that decoding an |X509| object will not check for invalid extensions. To
1751
- // detect the error case, call |X509_get_extensions_flags| and check the
1752
- // |EXFLAG_INVALID| bit.
1753
- OPENSSL_EXPORT long X509_get_pathlen(X509 *x509);
1754
-
1755
- // X509_SIG_get0 sets |*out_alg| and |*out_digest| to non-owning pointers to
1756
- // |sig|'s algorithm and digest fields, respectively. Either |out_alg| and
1757
- // |out_digest| may be NULL to skip those fields.
1758
- OPENSSL_EXPORT void X509_SIG_get0(const X509_SIG *sig,
1759
- const X509_ALGOR **out_alg,
1760
- const ASN1_OCTET_STRING **out_digest);
1761
-
1762
- // X509_SIG_getm behaves like |X509_SIG_get0| but returns mutable pointers.
1763
- OPENSSL_EXPORT void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **out_alg,
1764
- ASN1_OCTET_STRING **out_digest);
1765
-
1766
- // X509_verify_cert_error_string returns |err| as a human-readable string, where
1767
- // |err| should be one of the |X509_V_*| values. If |err| is unknown, it returns
1768
- // a default description.
1769
- OPENSSL_EXPORT const char *X509_verify_cert_error_string(long err);
1770
-
1771
- // X509_verify checks that |x509| has a valid signature by |pkey|. It returns
1772
- // one if the signature is valid and zero otherwise. Note this function only
1773
- // checks the signature itself and does not perform a full certificate
1774
- // validation.
1775
- OPENSSL_EXPORT int X509_verify(X509 *x509, EVP_PKEY *pkey);
1776
-
1777
- // X509_REQ_verify checks that |req| has a valid signature by |pkey|. It returns
1778
- // one if the signature is valid and zero otherwise.
1779
- OPENSSL_EXPORT int X509_REQ_verify(X509_REQ *req, EVP_PKEY *pkey);
1780
-
1781
- // X509_CRL_verify checks that |crl| has a valid signature by |pkey|. It returns
1782
- // one if the signature is valid and zero otherwise.
1783
- OPENSSL_EXPORT int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *pkey);
1784
-
1785
- // NETSCAPE_SPKI_verify checks that |spki| has a valid signature by |pkey|. It
1786
- // returns one if the signature is valid and zero otherwise.
1787
- OPENSSL_EXPORT int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *spki, EVP_PKEY *pkey);
1788
-
1789
- // NETSCAPE_SPKI_b64_decode decodes |len| bytes from |str| as a base64-encoded
1790
- // Netscape signed public key and challenge (SPKAC) structure. It returns a
1791
- // newly-allocated |NETSCAPE_SPKI| structure with the result, or NULL on error.
1792
- // If |len| is 0 or negative, the length is calculated with |strlen| and |str|
1793
- // must be a NUL-terminated C string.
1794
- OPENSSL_EXPORT NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str,
1795
- int len);
1796
-
1797
- // NETSCAPE_SPKI_b64_encode encodes |spki| as a base64-encoded Netscape signed
1798
- // public key and challenge (SPKAC) structure. It returns a newly-allocated
1799
- // NUL-terminated C string with the result, or NULL on error. The caller must
1800
- // release the memory with |OPENSSL_free| when done.
1801
- OPENSSL_EXPORT char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki);
1802
-
1803
- // NETSCAPE_SPKI_get_pubkey decodes and returns the public key in |spki| as an
1804
- // |EVP_PKEY|, or NULL on error. The caller takes ownership of the resulting
1805
- // pointer and must call |EVP_PKEY_free| when done.
1806
- OPENSSL_EXPORT EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *spki);
1807
-
1808
- // NETSCAPE_SPKI_set_pubkey sets |spki|'s public key to |pkey|. It returns one
1809
- // on success or zero on error. This function does not take ownership of |pkey|,
1810
- // so the caller may continue to manage its lifetime independently of |spki|.
1811
- OPENSSL_EXPORT int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *spki,
1812
- EVP_PKEY *pkey);
1813
-
1814
- // NETSCAPE_SPKI_sign signs |spki| with |pkey| and replaces the signature
1815
- // algorithm and signature fields. It returns one on success and zero on error.
1816
- // This function uses digest algorithm |md|, or |pkey|'s default if NULL. Other
1817
- // signing parameters use |pkey|'s defaults.
1818
- OPENSSL_EXPORT int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *spki, EVP_PKEY *pkey,
1819
- const EVP_MD *md);
1820
-
1821
- // X509_ATTRIBUTE_dup returns a newly-allocated copy of |xa|, or NULL on error.
1822
- // This function works by serializing the structure, so if |xa| is incomplete,
1823
- // it may fail.
1824
- OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_dup(const X509_ATTRIBUTE *xa);
1825
-
1826
- // X509_REVOKED_dup returns a newly-allocated copy of |rev|, or NULL on error.
1827
- // This function works by serializing the structure, so if |rev| is incomplete,
1828
- // it may fail.
1829
- OPENSSL_EXPORT X509_REVOKED *X509_REVOKED_dup(const X509_REVOKED *rev);
1830
-
1831
- // X509_cmp_time compares |s| against |*t|. On success, it returns a negative
1832
- // number if |s| <= |*t| and a positive number if |s| > |*t|. On error, it
1833
- // returns zero. If |t| is NULL, it uses the current time instead of |*t|.
1834
- //
1835
- // WARNING: Unlike most comparison functions, this function returns zero on
1836
- // error, not equality.
1837
- OPENSSL_EXPORT int X509_cmp_time(const ASN1_TIME *s, time_t *t);
1838
-
1839
- // X509_cmp_time_posix compares |s| against |t|. On success, it returns a
1840
- // negative number if |s| <= |t| and a positive number if |s| > |t|. On error,
1841
- // it returns zero.
2234
+ // X509_get_pathlen returns path length constraint from the basic constraints
2235
+ // extension in |x509|. (See RFC 5280, section 4.2.1.9.) It returns -1 if the
2236
+ // constraint is not present, or if some extension in |x509| was invalid.
1842
2237
  //
1843
- // WARNING: Unlike most comparison functions, this function returns zero on
1844
- // error, not equality.
1845
- OPENSSL_EXPORT int X509_cmp_time_posix(const ASN1_TIME *s, int64_t t);
2238
+ // Note that decoding an |X509| object will not check for invalid extensions. To
2239
+ // detect the error case, call |X509_get_extensions_flags| and check the
2240
+ // |EXFLAG_INVALID| bit.
2241
+ OPENSSL_EXPORT long X509_get_pathlen(X509 *x509);
1846
2242
 
1847
- // X509_cmp_current_time behaves like |X509_cmp_time| but compares |s| against
1848
- // the current time.
1849
- OPENSSL_EXPORT int X509_cmp_current_time(const ASN1_TIME *s);
2243
+ // X509_SIG_get0 sets |*out_alg| and |*out_digest| to non-owning pointers to
2244
+ // |sig|'s algorithm and digest fields, respectively. Either |out_alg| and
2245
+ // |out_digest| may be NULL to skip those fields.
2246
+ OPENSSL_EXPORT void X509_SIG_get0(const X509_SIG *sig,
2247
+ const X509_ALGOR **out_alg,
2248
+ const ASN1_OCTET_STRING **out_digest);
1850
2249
 
1851
- // X509_time_adj calls |X509_time_adj_ex| with |offset_day| equal to zero.
1852
- OPENSSL_EXPORT ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec,
1853
- time_t *t);
2250
+ // X509_SIG_getm behaves like |X509_SIG_get0| but returns mutable pointers.
2251
+ OPENSSL_EXPORT void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **out_alg,
2252
+ ASN1_OCTET_STRING **out_digest);
1854
2253
 
1855
- // X509_time_adj_ex behaves like |ASN1_TIME_adj|, but adds an offset to |*t|. If
1856
- // |t| is NULL, it uses the current time instead of |*t|.
1857
- OPENSSL_EXPORT ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, int offset_day,
1858
- long offset_sec, time_t *t);
2254
+ // X509_verify_cert_error_string returns |err| as a human-readable string, where
2255
+ // |err| should be one of the |X509_V_*| values. If |err| is unknown, it returns
2256
+ // a default description.
2257
+ OPENSSL_EXPORT const char *X509_verify_cert_error_string(long err);
1859
2258
 
1860
- // X509_gmtime_adj behaves like |X509_time_adj_ex| but adds |offset_sec| to the
1861
- // current time.
1862
- OPENSSL_EXPORT ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long offset_sec);
2259
+ // X509_REVOKED_dup returns a newly-allocated copy of |rev|, or NULL on error.
2260
+ // This function works by serializing the structure, so if |rev| is incomplete,
2261
+ // it may fail.
2262
+ OPENSSL_EXPORT X509_REVOKED *X509_REVOKED_dup(const X509_REVOKED *rev);
1863
2263
 
1864
2264
  OPENSSL_EXPORT const char *X509_get_default_cert_area(void);
1865
2265
  OPENSSL_EXPORT const char *X509_get_default_cert_dir(void);
@@ -1883,15 +2283,6 @@ OPENSSL_EXPORT EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key);
1883
2283
 
1884
2284
  DECLARE_ASN1_FUNCTIONS_const(X509_SIG)
1885
2285
 
1886
- DECLARE_ASN1_FUNCTIONS_const(X509_ATTRIBUTE)
1887
-
1888
- // X509_ATTRIBUTE_create returns a newly-allocated |X509_ATTRIBUTE|, or NULL on
1889
- // error. The attribute has type |nid| and contains a single value determined by
1890
- // |attrtype| and |value|, which are interpreted as in |ASN1_TYPE_set|. Note
1891
- // this function takes ownership of |value|.
1892
- OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype,
1893
- void *value);
1894
-
1895
2286
  OPENSSL_EXPORT int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj);
1896
2287
  OPENSSL_EXPORT int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj);
1897
2288
  OPENSSL_EXPORT void X509_trust_clear(X509 *x);
@@ -1911,12 +2302,8 @@ OPENSSL_EXPORT int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret,
1911
2302
  OPENSSL_EXPORT X509_PKEY *X509_PKEY_new(void);
1912
2303
  OPENSSL_EXPORT void X509_PKEY_free(X509_PKEY *a);
1913
2304
 
1914
- DECLARE_ASN1_FUNCTIONS_const(NETSCAPE_SPKI)
1915
- DECLARE_ASN1_FUNCTIONS_const(NETSCAPE_SPKAC)
1916
-
1917
2305
  OPENSSL_EXPORT X509_INFO *X509_INFO_new(void);
1918
2306
  OPENSSL_EXPORT void X509_INFO_free(X509_INFO *a);
1919
- OPENSSL_EXPORT char *X509_NAME_oneline(const X509_NAME *a, char *buf, int size);
1920
2307
 
1921
2308
  OPENSSL_EXPORT int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data,
1922
2309
  unsigned char *md, unsigned int *len);
@@ -1939,93 +2326,6 @@ OPENSSL_EXPORT int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1,
1939
2326
  ASN1_BIT_STRING *signature, void *asn,
1940
2327
  EVP_MD_CTX *ctx);
1941
2328
 
1942
- // X509_REQ_extension_nid returns one if |nid| is a supported CSR attribute type
1943
- // for carrying extensions and zero otherwise. The supported types are
1944
- // |NID_ext_req| (pkcs-9-at-extensionRequest from RFC 2985) and |NID_ms_ext_req|
1945
- // (a Microsoft szOID_CERT_EXTENSIONS variant).
1946
- OPENSSL_EXPORT int X509_REQ_extension_nid(int nid);
1947
-
1948
- // X509_REQ_get_extensions decodes the list of requested extensions in |req| and
1949
- // returns a newly-allocated |STACK_OF(X509_EXTENSION)| containing the result.
1950
- // It returns NULL on error, or if |req| did not request extensions.
1951
- //
1952
- // This function supports both pkcs-9-at-extensionRequest from RFC 2985 and the
1953
- // Microsoft szOID_CERT_EXTENSIONS variant.
1954
- OPENSSL_EXPORT STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req);
1955
-
1956
- // X509_REQ_add_extensions_nid adds an attribute to |req| of type |nid|, to
1957
- // request the certificate extensions in |exts|. It returns one on success and
1958
- // zero on error. |nid| should be |NID_ext_req| or |NID_ms_ext_req|.
1959
- OPENSSL_EXPORT int X509_REQ_add_extensions_nid(
1960
- X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts, int nid);
1961
-
1962
- // X509_REQ_add_extensions behaves like |X509_REQ_add_extensions_nid|, using the
1963
- // standard |NID_ext_req| for the attribute type.
1964
- OPENSSL_EXPORT int X509_REQ_add_extensions(
1965
- X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts);
1966
-
1967
- // X509_REQ_get_attr_count returns the number of attributes in |req|.
1968
- OPENSSL_EXPORT int X509_REQ_get_attr_count(const X509_REQ *req);
1969
-
1970
- // X509_REQ_get_attr_by_NID returns the index of the attribute in |req| of type
1971
- // |nid|, or a negative number if not found. If found, callers can use
1972
- // |X509_REQ_get_attr| to look up the attribute by index.
1973
- //
1974
- // If |lastpos| is non-negative, it begins searching at |lastpos| + 1. Callers
1975
- // can thus loop over all matching attributes by first passing -1 and then
1976
- // passing the previously-returned value until no match is returned.
1977
- OPENSSL_EXPORT int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid,
1978
- int lastpos);
1979
-
1980
- // X509_REQ_get_attr_by_OBJ behaves like |X509_REQ_get_attr_by_NID| but looks
1981
- // for attributes of type |obj|.
1982
- OPENSSL_EXPORT int X509_REQ_get_attr_by_OBJ(const X509_REQ *req,
1983
- const ASN1_OBJECT *obj,
1984
- int lastpos);
1985
-
1986
- // X509_REQ_get_attr returns the attribute at index |loc| in |req|, or NULL if
1987
- // out of bounds.
1988
- OPENSSL_EXPORT X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc);
1989
-
1990
- // X509_REQ_delete_attr removes the attribute at index |loc| in |req|. It
1991
- // returns the removed attribute to the caller, or NULL if |loc| was out of
1992
- // bounds. If non-NULL, the caller must release the result with
1993
- // |X509_ATTRIBUTE_free| when done. It is also safe, but not necessary, to call
1994
- // |X509_ATTRIBUTE_free| if the result is NULL.
1995
- OPENSSL_EXPORT X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc);
1996
-
1997
- // X509_REQ_add1_attr appends a copy of |attr| to |req|'s list of attributes. It
1998
- // returns one on success and zero on error.
1999
- //
2000
- // TODO(https://crbug.com/boringssl/407): |attr| should be const.
2001
- OPENSSL_EXPORT int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr);
2002
-
2003
- // X509_REQ_add1_attr_by_OBJ appends a new attribute to |req| with type |obj|.
2004
- // It returns one on success and zero on error. The value is determined by
2005
- // |X509_ATTRIBUTE_set1_data|.
2006
- //
2007
- // WARNING: The interpretation of |attrtype|, |data|, and |len| is complex and
2008
- // error-prone. See |X509_ATTRIBUTE_set1_data| for details.
2009
- OPENSSL_EXPORT int X509_REQ_add1_attr_by_OBJ(X509_REQ *req,
2010
- const ASN1_OBJECT *obj,
2011
- int attrtype,
2012
- const unsigned char *data,
2013
- int len);
2014
-
2015
- // X509_REQ_add1_attr_by_NID behaves like |X509_REQ_add1_attr_by_OBJ| except the
2016
- // attribute type is determined by |nid|.
2017
- OPENSSL_EXPORT int X509_REQ_add1_attr_by_NID(X509_REQ *req, int nid,
2018
- int attrtype,
2019
- const unsigned char *data,
2020
- int len);
2021
-
2022
- // X509_REQ_add1_attr_by_txt behaves like |X509_REQ_add1_attr_by_OBJ| except the
2023
- // attribute type is determined by calling |OBJ_txt2obj| with |attrname|.
2024
- OPENSSL_EXPORT int X509_REQ_add1_attr_by_txt(X509_REQ *req,
2025
- const char *attrname, int attrtype,
2026
- const unsigned char *data,
2027
- int len);
2028
-
2029
2329
  OPENSSL_EXPORT int X509_CRL_sort(X509_CRL *crl);
2030
2330
 
2031
2331
  // X509_REVOKED_get0_serialNumber returns the serial number of the certificate
@@ -2077,24 +2377,6 @@ OPENSSL_EXPORT unsigned long X509_NAME_hash_old(X509_NAME *x);
2077
2377
 
2078
2378
  OPENSSL_EXPORT int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b);
2079
2379
  OPENSSL_EXPORT int X509_CRL_match(const X509_CRL *a, const X509_CRL *b);
2080
- OPENSSL_EXPORT int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag,
2081
- unsigned long cflag);
2082
- OPENSSL_EXPORT int X509_print_fp(FILE *bp, X509 *x);
2083
- OPENSSL_EXPORT int X509_CRL_print_fp(FILE *bp, X509_CRL *x);
2084
- OPENSSL_EXPORT int X509_REQ_print_fp(FILE *bp, X509_REQ *req);
2085
- OPENSSL_EXPORT int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm,
2086
- int indent, unsigned long flags);
2087
-
2088
- OPENSSL_EXPORT int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase);
2089
- OPENSSL_EXPORT int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent,
2090
- unsigned long flags);
2091
- OPENSSL_EXPORT int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag,
2092
- unsigned long cflag);
2093
- OPENSSL_EXPORT int X509_print(BIO *bp, X509 *x);
2094
- OPENSSL_EXPORT int X509_CRL_print(BIO *bp, X509_CRL *x);
2095
- OPENSSL_EXPORT int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag,
2096
- unsigned long cflag);
2097
- OPENSSL_EXPORT int X509_REQ_print(BIO *bp, X509_REQ *req);
2098
2380
 
2099
2381
  // X509_get_ext_d2i behaves like |X509V3_get_d2i| but looks for the extension in
2100
2382
  // |x509|'s extension list.
@@ -2190,153 +2472,6 @@ OPENSSL_EXPORT int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid,
2190
2472
  void *value, int crit,
2191
2473
  unsigned long flags);
2192
2474
 
2193
- // X509at_get_attr_count returns the number of attributes in |x|.
2194
- OPENSSL_EXPORT int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x);
2195
-
2196
- // X509at_get_attr_by_NID returns the index of the attribute in |x| of type
2197
- // |nid|, or a negative number if not found. If found, callers can use
2198
- // |X509at_get_attr| to look up the attribute by index.
2199
- //
2200
- // If |lastpos| is non-negative, it begins searching at |lastpos| + 1. Callers
2201
- // can thus loop over all matching attributes by first passing -1 and then
2202
- // passing the previously-returned value until no match is returned.
2203
- OPENSSL_EXPORT int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x,
2204
- int nid, int lastpos);
2205
-
2206
- // X509at_get_attr_by_OBJ behaves like |X509at_get_attr_by_NID| but looks for
2207
- // attributes of type |obj|.
2208
- OPENSSL_EXPORT int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk,
2209
- const ASN1_OBJECT *obj, int lastpos);
2210
-
2211
- // X509at_get_attr returns the attribute at index |loc| in |x|, or NULL if
2212
- // out of bounds.
2213
- OPENSSL_EXPORT X509_ATTRIBUTE *X509at_get_attr(
2214
- const STACK_OF(X509_ATTRIBUTE) *x, int loc);
2215
-
2216
- // X509at_delete_attr removes the attribute at index |loc| in |x|. It returns
2217
- // the removed attribute to the caller, or NULL if |loc| was out of bounds. If
2218
- // non-NULL, the caller must release the result with |X509_ATTRIBUTE_free| when
2219
- // done. It is also safe, but not necessary, to call |X509_ATTRIBUTE_free| if
2220
- // the result is NULL.
2221
- OPENSSL_EXPORT X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x,
2222
- int loc);
2223
-
2224
- // X509at_add1_attr appends a copy of |attr| to the attribute list in |*x|. If
2225
- // |*x| is NULL, it allocates a new |STACK_OF(X509_ATTRIBUTE)| to hold the copy
2226
- // and sets |*x| to the new list. It returns |*x| on success and NULL on error.
2227
- // The caller retains ownership of |attr| and can release it independently of
2228
- // |*x|.
2229
- OPENSSL_EXPORT STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(
2230
- STACK_OF(X509_ATTRIBUTE) **x, X509_ATTRIBUTE *attr);
2231
-
2232
- // X509at_add1_attr_by_OBJ behaves like |X509at_add1_attr|, but adds an
2233
- // attribute created by |X509_ATTRIBUTE_create_by_OBJ|.
2234
- OPENSSL_EXPORT STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(
2235
- STACK_OF(X509_ATTRIBUTE) **x, const ASN1_OBJECT *obj, int type,
2236
- const unsigned char *bytes, int len);
2237
-
2238
- // X509at_add1_attr_by_NID behaves like |X509at_add1_attr|, but adds an
2239
- // attribute created by |X509_ATTRIBUTE_create_by_NID|.
2240
- OPENSSL_EXPORT STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(
2241
- STACK_OF(X509_ATTRIBUTE) **x, int nid, int type, const unsigned char *bytes,
2242
- int len);
2243
-
2244
- // X509at_add1_attr_by_txt behaves like |X509at_add1_attr|, but adds an
2245
- // attribute created by |X509_ATTRIBUTE_create_by_txt|.
2246
- OPENSSL_EXPORT STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(
2247
- STACK_OF(X509_ATTRIBUTE) **x, const char *attrname, int type,
2248
- const unsigned char *bytes, int len);
2249
-
2250
- // X509_ATTRIBUTE_create_by_NID returns a newly-allocated |X509_ATTRIBUTE| of
2251
- // type |nid|, or NULL on error. The value is determined as in
2252
- // |X509_ATTRIBUTE_set1_data|.
2253
- //
2254
- // If |attr| is non-NULL, the resulting |X509_ATTRIBUTE| is also written to
2255
- // |*attr|. If |*attr| was non-NULL when the function was called, |*attr| is
2256
- // reused instead of creating a new object.
2257
- //
2258
- // WARNING: The interpretation of |attrtype|, |data|, and |len| is complex and
2259
- // error-prone. See |X509_ATTRIBUTE_set1_data| for details.
2260
- //
2261
- // WARNING: The object reuse form is deprecated and may be removed in the
2262
- // future. It also currently incorrectly appends to the reused object's value
2263
- // set rather than overwriting it.
2264
- OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(
2265
- X509_ATTRIBUTE **attr, int nid, int attrtype, const void *data, int len);
2266
-
2267
- // X509_ATTRIBUTE_create_by_OBJ behaves like |X509_ATTRIBUTE_create_by_NID|
2268
- // except the attribute's type is determined by |obj|.
2269
- OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(
2270
- X509_ATTRIBUTE **attr, const ASN1_OBJECT *obj, int attrtype,
2271
- const void *data, int len);
2272
-
2273
- // X509_ATTRIBUTE_create_by_txt behaves like |X509_ATTRIBUTE_create_by_NID|
2274
- // except the attribute's type is determined by calling |OBJ_txt2obj| with
2275
- // |attrname|.
2276
- OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(
2277
- X509_ATTRIBUTE **attr, const char *attrname, int type,
2278
- const unsigned char *bytes, int len);
2279
-
2280
- // X509_ATTRIBUTE_set1_object sets |attr|'s type to |obj|. It returns one on
2281
- // success and zero on error.
2282
- OPENSSL_EXPORT int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr,
2283
- const ASN1_OBJECT *obj);
2284
-
2285
- // X509_ATTRIBUTE_set1_data appends a value to |attr|'s value set and returns
2286
- // one on success or zero on error. The value is determined as follows:
2287
- //
2288
- // If |attrtype| is a |MBSTRING_*| constant, the value is an ASN.1 string. The
2289
- // string is determined by decoding |len| bytes from |data| in the encoding
2290
- // specified by |attrtype|, and then re-encoding it in a form appropriate for
2291
- // |attr|'s type. If |len| is -1, |strlen(data)| is used instead. See
2292
- // |ASN1_STRING_set_by_NID| for details.
2293
- //
2294
- // Otherwise, if |len| is not -1, the value is an ASN.1 string. |attrtype| is an
2295
- // |ASN1_STRING| type value and the |len| bytes from |data| are copied as the
2296
- // type-specific representation of |ASN1_STRING|. See |ASN1_STRING| for details.
2297
- //
2298
- // WARNING: If this form is used to construct a negative INTEGER or ENUMERATED,
2299
- // |attrtype| includes the |V_ASN1_NEG| flag for |ASN1_STRING|, but the function
2300
- // forgets to clear the flag for |ASN1_TYPE|. This matches OpenSSL but is
2301
- // probably a bug. For now, do not use this form with negative values.
2302
- //
2303
- // Otherwise, if |len| is -1, the value is constructed by passing |attrtype| and
2304
- // |data| to |ASN1_TYPE_set1|. That is, |attrtype| is an |ASN1_TYPE| type value,
2305
- // and |data| is cast to the corresponding pointer type.
2306
- //
2307
- // WARNING: Despite the name, this function appends to |attr|'s value set,
2308
- // rather than overwriting it. To overwrite the value set, create a new
2309
- // |X509_ATTRIBUTE| with |X509_ATTRIBUTE_new|.
2310
- //
2311
- // WARNING: If using the |MBSTRING_*| form, pass a length rather than relying on
2312
- // |strlen|. In particular, |strlen| will not behave correctly if the input is
2313
- // |MBSTRING_BMP| or |MBSTRING_UNIV|.
2314
- //
2315
- // WARNING: This function currently misinterprets |V_ASN1_OTHER| as an
2316
- // |MBSTRING_*| constant. This matches OpenSSL but means it is impossible to
2317
- // construct a value with a non-universal tag.
2318
- OPENSSL_EXPORT int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype,
2319
- const void *data, int len);
2320
-
2321
- // X509_ATTRIBUTE_get0_data returns the |idx|th value of |attr| in a
2322
- // type-specific representation to |attrtype|, or NULL if out of bounds or the
2323
- // type does not match. |attrtype| is one of the type values in |ASN1_TYPE|. On
2324
- // match, the return value uses the same representation as |ASN1_TYPE_set0|. See
2325
- // |ASN1_TYPE| for details.
2326
- OPENSSL_EXPORT void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx,
2327
- int attrtype, void *unused);
2328
-
2329
- // X509_ATTRIBUTE_count returns the number of values in |attr|.
2330
- OPENSSL_EXPORT int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr);
2331
-
2332
- // X509_ATTRIBUTE_get0_object returns the type of |attr|.
2333
- OPENSSL_EXPORT ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr);
2334
-
2335
- // X509_ATTRIBUTE_get0_type returns the |idx|th value in |attr|, or NULL if out
2336
- // of bounds. Note this function returns one of |attr|'s values, not the type.
2337
- OPENSSL_EXPORT ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr,
2338
- int idx);
2339
-
2340
2475
  OPENSSL_EXPORT int X509_verify_cert(X509_STORE_CTX *ctx);
2341
2476
 
2342
2477
  // PKCS#8 utilities
@@ -2635,6 +2770,11 @@ OPENSSL_EXPORT void X509_STORE_set_verify(X509_STORE *ctx,
2635
2770
  OPENSSL_EXPORT void X509_STORE_CTX_set_verify(X509_STORE_CTX *ctx,
2636
2771
  X509_STORE_CTX_verify_fn verify);
2637
2772
  OPENSSL_EXPORT X509_STORE_CTX_verify_fn X509_STORE_get_verify(X509_STORE *ctx);
2773
+
2774
+ // X509_STORE_set_verify_cb acts like |X509_STORE_CTX_set_verify_cb| but sets
2775
+ // the verify callback for any |X509_STORE_CTX| created from this |X509_STORE|
2776
+ //
2777
+ // Do not use this funciton. see |X509_STORE_CTX_set_verify_cb|.
2638
2778
  OPENSSL_EXPORT void X509_STORE_set_verify_cb(
2639
2779
  X509_STORE *ctx, X509_STORE_CTX_verify_cb verify_cb);
2640
2780
  #define X509_STORE_set_verify_cb_func(ctx, func) \
@@ -2775,8 +2915,27 @@ OPENSSL_EXPORT void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx,
2775
2915
  OPENSSL_EXPORT void X509_STORE_CTX_set_time_posix(X509_STORE_CTX *ctx,
2776
2916
  unsigned long flags,
2777
2917
  int64_t t);
2918
+
2919
+ // X509_STORE_CTX_set_verify_cb configures a callback function for |ctx| that is
2920
+ // called multiple times during |X509_verify_cert|. The callback returns zero to
2921
+ // fail verification and non-zero to proceed. Typically, it will return |ok|,
2922
+ // which preserves the default behavior. Returning one when |ok| is zero will
2923
+ // proceed past some error. The callback may inspect |ctx| and the error queue
2924
+ // to attempt to determine the current stage of certificate verification, but
2925
+ // this is often unreliable.
2926
+ //
2927
+ // WARNING: Do not use this function. It is extremely fragile and unpredictable.
2928
+ // This callback exposes implementation details of certificate verification,
2929
+ // which change as the library evolves. Attempting to use it for security checks
2930
+ // can introduce vulnerabilities if making incorrect assumptions about when the
2931
+ // callback is called. Additionally, overriding |ok| may leave |ctx| in an
2932
+ // inconsistent state and break invariants.
2933
+ //
2934
+ // Instead, customize certificate verification by configuring options on the
2935
+ // |X509_STORE_CTX| before verification, or applying additional checks after
2936
+ // |X509_verify_cert| completes successfully.
2778
2937
  OPENSSL_EXPORT void X509_STORE_CTX_set_verify_cb(
2779
- X509_STORE_CTX *ctx, int (*verify_cb)(int, X509_STORE_CTX *));
2938
+ X509_STORE_CTX *ctx, int (*verify_cb)(int ok, X509_STORE_CTX *ctx));
2780
2939
 
2781
2940
  OPENSSL_EXPORT X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(
2782
2941
  X509_STORE_CTX *ctx);