1e71b7053SJung-uk Kim=pod 2e71b7053SJung-uk Kim 3e71b7053SJung-uk Kim=head1 NAME 4e71b7053SJung-uk Kim 5e71b7053SJung-uk KimX509V3_get_d2i, X509V3_add1_i2d, X509V3_EXT_d2i, X509V3_EXT_i2d, 6b077aed3SPierre ProncheryX509_get_ext_d2i, X509_add1_ext_i2d, 7b077aed3SPierre ProncheryX509_CRL_get_ext_d2i, X509_CRL_add1_ext_i2d, 8b077aed3SPierre ProncheryX509_REVOKED_get_ext_d2i, X509_REVOKED_add1_ext_i2d, 9b077aed3SPierre ProncheryX509_get0_extensions, X509_CRL_get0_extensions, 10b077aed3SPierre ProncheryX509_REVOKED_get0_extensions - X509 extension decode and encode functions 11e71b7053SJung-uk Kim 12e71b7053SJung-uk Kim=head1 SYNOPSIS 13e71b7053SJung-uk Kim 14e71b7053SJung-uk Kim #include <openssl/x509v3.h> 15e71b7053SJung-uk Kim 16e71b7053SJung-uk Kim void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *x, int nid, int *crit, 17e71b7053SJung-uk Kim int *idx); 18e71b7053SJung-uk Kim int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, 19e71b7053SJung-uk Kim int crit, unsigned long flags); 20e71b7053SJung-uk Kim 21e71b7053SJung-uk Kim void *X509V3_EXT_d2i(X509_EXTENSION *ext); 22b077aed3SPierre Pronchery X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); 23e71b7053SJung-uk Kim 24e71b7053SJung-uk Kim void *X509_get_ext_d2i(const X509 *x, int nid, int *crit, int *idx); 25e71b7053SJung-uk Kim int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, 26e71b7053SJung-uk Kim unsigned long flags); 27e71b7053SJung-uk Kim 28e71b7053SJung-uk Kim void *X509_CRL_get_ext_d2i(const X509_CRL *crl, int nid, int *crit, int *idx); 29e71b7053SJung-uk Kim int X509_CRL_add1_ext_i2d(X509_CRL *crl, int nid, void *value, int crit, 30e71b7053SJung-uk Kim unsigned long flags); 31e71b7053SJung-uk Kim 32e71b7053SJung-uk Kim void *X509_REVOKED_get_ext_d2i(const X509_REVOKED *r, int nid, int *crit, int *idx); 33e71b7053SJung-uk Kim int X509_REVOKED_add1_ext_i2d(X509_REVOKED *r, int nid, void *value, int crit, 34e71b7053SJung-uk Kim unsigned long flags); 35e71b7053SJung-uk Kim 36e71b7053SJung-uk Kim const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x); 37e71b7053SJung-uk Kim const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl); 38e71b7053SJung-uk Kim const STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions(const X509_REVOKED *r); 39e71b7053SJung-uk Kim 40e71b7053SJung-uk Kim=head1 DESCRIPTION 41e71b7053SJung-uk Kim 42b077aed3SPierre ProncheryX509V3_get_d2i() looks for an extension with OID I<nid> in the extensions 43b077aed3SPierre ProncheryI<x> and, if found, decodes it. If I<idx> is NULL then only one 44b077aed3SPierre Proncheryoccurrence of an extension is permissible, otherwise the first extension after 45b077aed3SPierre Proncheryindex I<*idx> is returned and I<*idx> updated to the location of the extension. 46b077aed3SPierre ProncheryIf I<crit> is not NULL then I<*crit> is set to a status value: -2 if the 47b077aed3SPierre Proncheryextension occurs multiple times (this is only returned if I<idx> is NULL), 48e71b7053SJung-uk Kim-1 if the extension could not be found, 0 if the extension is found and is 49e71b7053SJung-uk Kimnot critical and 1 if critical. A pointer to an extension specific structure 50b077aed3SPierre Proncheryor NULL is returned. 51e71b7053SJung-uk Kim 52b077aed3SPierre ProncheryX509V3_add1_i2d() adds extension I<value> to STACK I<*x> (allocating a new 53b077aed3SPierre ProncherySTACK if necessary) using OID I<nid> and criticality I<crit> according 54b077aed3SPierre Proncheryto I<flags>. 55e71b7053SJung-uk Kim 56e71b7053SJung-uk KimX509V3_EXT_d2i() attempts to decode the ASN.1 data contained in extension 57b077aed3SPierre ProncheryI<ext> and returns a pointer to an extension specific structure or NULL 58e71b7053SJung-uk Kimif the extension could not be decoded (invalid syntax or not supported). 59e71b7053SJung-uk Kim 60b077aed3SPierre ProncheryX509V3_EXT_i2d() encodes the extension specific structure I<ext_struc> 61b077aed3SPierre Proncherywith OID I<ext_nid> and criticality I<crit>. 62e71b7053SJung-uk Kim 63e71b7053SJung-uk KimX509_get_ext_d2i() and X509_add1_ext_i2d() operate on the extensions of 64b077aed3SPierre Proncherycertificate I<x>. They are otherwise identical to X509V3_get_d2i() and 65b077aed3SPierre ProncheryX509V3_add1_i2d(). 66e71b7053SJung-uk Kim 67e71b7053SJung-uk KimX509_CRL_get_ext_d2i() and X509_CRL_add1_ext_i2d() operate on the extensions 68b077aed3SPierre Proncheryof CRL I<crl>. They are otherwise identical to X509V3_get_d2i() and 69b077aed3SPierre ProncheryX509V3_add1_i2d(). 70e71b7053SJung-uk Kim 71e71b7053SJung-uk KimX509_REVOKED_get_ext_d2i() and X509_REVOKED_add1_ext_i2d() operate on the 72b077aed3SPierre Proncheryextensions of B<X509_REVOKED> structure I<r> (i.e for CRL entry extensions). 73b077aed3SPierre ProncheryThey are otherwise identical to X509V3_get_d2i() and X509V3_add1_i2d(). 74e71b7053SJung-uk Kim 75e71b7053SJung-uk KimX509_get0_extensions(), X509_CRL_get0_extensions() and 76b077aed3SPierre ProncheryX509_REVOKED_get0_extensions() return a STACK of all the extensions 77b077aed3SPierre Proncheryof a certificate, a CRL or a CRL entry respectively. 78e71b7053SJung-uk Kim 79e71b7053SJung-uk Kim=head1 NOTES 80e71b7053SJung-uk Kim 81e71b7053SJung-uk KimIn almost all cases an extension can occur at most once and multiple 82b077aed3SPierre Proncheryoccurrences is an error. Therefore, the I<idx> parameter is usually NULL. 83e71b7053SJung-uk Kim 84b077aed3SPierre ProncheryThe I<flags> parameter may be one of the following values. 85e71b7053SJung-uk Kim 86e71b7053SJung-uk KimB<X509V3_ADD_DEFAULT> appends a new extension only if the extension does 87b077aed3SPierre Proncherynot exist. An error is returned if the extension exists. 88e71b7053SJung-uk Kim 89e71b7053SJung-uk KimB<X509V3_ADD_APPEND> appends a new extension, ignoring whether the extension 90b077aed3SPierre Proncheryexists. 91e71b7053SJung-uk Kim 92b077aed3SPierre ProncheryB<X509V3_ADD_REPLACE> replaces an existing extension. If the extension does 93b077aed3SPierre Proncherynot exist, appends a new extension. 94e71b7053SJung-uk Kim 95b077aed3SPierre ProncheryB<X509V3_ADD_REPLACE_EXISTING> replaces an existing extension. If the 96b077aed3SPierre Proncheryextension does not exist, returns an error. 97e71b7053SJung-uk Kim 98e71b7053SJung-uk KimB<X509V3_ADD_KEEP_EXISTING> appends a new extension only if the extension does 99b077aed3SPierre Proncherynot exist. An error is B<not> returned if the extension exists. 100e71b7053SJung-uk Kim 101b077aed3SPierre ProncheryB<X509V3_ADD_DELETE> deletes and frees an existing extension. If the extension 102b077aed3SPierre Proncherydoes not exist, returns an error. No new extension is added. 103e71b7053SJung-uk Kim 104b077aed3SPierre ProncheryIf B<X509V3_ADD_SILENT> is bitwise ORed with I<flags>: any error returned 105b077aed3SPierre Proncherywill not be added to the error queue. 106e71b7053SJung-uk Kim 107b077aed3SPierre ProncheryThe function X509V3_get_d2i() and its variants 108b077aed3SPierre Proncherywill return NULL if the extension is not 109e71b7053SJung-uk Kimfound, occurs multiple times or cannot be decoded. It is possible to 110b077aed3SPierre Proncherydetermine the precise reason by checking the value of I<*crit>. 111*a7148ab3SEnji CooperThe returned pointer must be explicitly freed. 112b077aed3SPierre Pronchery 113b077aed3SPierre ProncheryThe function X509V3_add1_i2d() and its variants allocate B<X509_EXTENSION> 114b077aed3SPierre Proncheryobjects on STACK I<*x> depending on I<flags>. The B<X509_EXTENSION> objects 115b077aed3SPierre Proncherymust be explicitly freed using X509_EXTENSION_free(). 116e71b7053SJung-uk Kim 117e71b7053SJung-uk Kim=head1 SUPPORTED EXTENSIONS 118e71b7053SJung-uk Kim 119e71b7053SJung-uk KimThe following sections contain a list of all supported extensions 120e71b7053SJung-uk Kimincluding their name and NID. 121e71b7053SJung-uk Kim 122e71b7053SJung-uk Kim=head2 PKIX Certificate Extensions 123e71b7053SJung-uk Kim 124e71b7053SJung-uk KimThe following certificate extensions are defined in PKIX standards such as 125e71b7053SJung-uk KimRFC5280. 126e71b7053SJung-uk Kim 127e71b7053SJung-uk Kim Basic Constraints NID_basic_constraints 128e71b7053SJung-uk Kim Key Usage NID_key_usage 129e71b7053SJung-uk Kim Extended Key Usage NID_ext_key_usage 130e71b7053SJung-uk Kim 131e71b7053SJung-uk Kim Subject Key Identifier NID_subject_key_identifier 132e71b7053SJung-uk Kim Authority Key Identifier NID_authority_key_identifier 133e71b7053SJung-uk Kim 134e71b7053SJung-uk Kim Private Key Usage Period NID_private_key_usage_period 135e71b7053SJung-uk Kim 136e71b7053SJung-uk Kim Subject Alternative Name NID_subject_alt_name 137e71b7053SJung-uk Kim Issuer Alternative Name NID_issuer_alt_name 138e71b7053SJung-uk Kim 139e71b7053SJung-uk Kim Authority Information Access NID_info_access 140e71b7053SJung-uk Kim Subject Information Access NID_sinfo_access 141e71b7053SJung-uk Kim 142e71b7053SJung-uk Kim Name Constraints NID_name_constraints 143e71b7053SJung-uk Kim 144e71b7053SJung-uk Kim Certificate Policies NID_certificate_policies 145e71b7053SJung-uk Kim Policy Mappings NID_policy_mappings 146e71b7053SJung-uk Kim Policy Constraints NID_policy_constraints 147e71b7053SJung-uk Kim Inhibit Any Policy NID_inhibit_any_policy 148e71b7053SJung-uk Kim 149e71b7053SJung-uk Kim TLS Feature NID_tlsfeature 150e71b7053SJung-uk Kim 151e71b7053SJung-uk Kim=head2 Netscape Certificate Extensions 152e71b7053SJung-uk Kim 153e71b7053SJung-uk KimThe following are (largely obsolete) Netscape certificate extensions. 154e71b7053SJung-uk Kim 155e71b7053SJung-uk Kim Netscape Cert Type NID_netscape_cert_type 156e71b7053SJung-uk Kim Netscape Base Url NID_netscape_base_url 157e71b7053SJung-uk Kim Netscape Revocation Url NID_netscape_revocation_url 158e71b7053SJung-uk Kim Netscape CA Revocation Url NID_netscape_ca_revocation_url 159e71b7053SJung-uk Kim Netscape Renewal Url NID_netscape_renewal_url 160e71b7053SJung-uk Kim Netscape CA Policy Url NID_netscape_ca_policy_url 161e71b7053SJung-uk Kim Netscape SSL Server Name NID_netscape_ssl_server_name 162e71b7053SJung-uk Kim Netscape Comment NID_netscape_comment 163e71b7053SJung-uk Kim 164e71b7053SJung-uk Kim=head2 Miscellaneous Certificate Extensions 165e71b7053SJung-uk Kim 166e71b7053SJung-uk Kim Strong Extranet ID NID_sxnet 167e71b7053SJung-uk Kim Proxy Certificate Information NID_proxyCertInfo 168e71b7053SJung-uk Kim 169e71b7053SJung-uk Kim=head2 PKIX CRL Extensions 170e71b7053SJung-uk Kim 171e71b7053SJung-uk KimThe following are CRL extensions from PKIX standards such as RFC5280. 172e71b7053SJung-uk Kim 173e71b7053SJung-uk Kim CRL Number NID_crl_number 174e71b7053SJung-uk Kim CRL Distribution Points NID_crl_distribution_points 175e71b7053SJung-uk Kim Delta CRL Indicator NID_delta_crl 176e71b7053SJung-uk Kim Freshest CRL NID_freshest_crl 177e71b7053SJung-uk Kim Invalidity Date NID_invalidity_date 178e71b7053SJung-uk Kim Issuing Distribution Point NID_issuing_distribution_point 179e71b7053SJung-uk Kim 180e71b7053SJung-uk KimThe following are CRL entry extensions from PKIX standards such as RFC5280. 181e71b7053SJung-uk Kim 182e71b7053SJung-uk Kim CRL Reason Code NID_crl_reason 183e71b7053SJung-uk Kim Certificate Issuer NID_certificate_issuer 184e71b7053SJung-uk Kim 185e71b7053SJung-uk Kim=head2 OCSP Extensions 186e71b7053SJung-uk Kim 187e71b7053SJung-uk Kim OCSP Nonce NID_id_pkix_OCSP_Nonce 188e71b7053SJung-uk Kim OCSP CRL ID NID_id_pkix_OCSP_CrlID 189e71b7053SJung-uk Kim Acceptable OCSP Responses NID_id_pkix_OCSP_acceptableResponses 190e71b7053SJung-uk Kim OCSP No Check NID_id_pkix_OCSP_noCheck 191e71b7053SJung-uk Kim OCSP Archive Cutoff NID_id_pkix_OCSP_archiveCutoff 192e71b7053SJung-uk Kim OCSP Service Locator NID_id_pkix_OCSP_serviceLocator 193e71b7053SJung-uk Kim Hold Instruction Code NID_hold_instruction_code 194e71b7053SJung-uk Kim 195e71b7053SJung-uk Kim=head2 Certificate Transparency Extensions 196e71b7053SJung-uk Kim 197e71b7053SJung-uk KimThe following extensions are used by certificate transparency, RFC6962 198e71b7053SJung-uk Kim 199e71b7053SJung-uk Kim CT Precertificate SCTs NID_ct_precert_scts 200e71b7053SJung-uk Kim CT Certificate SCTs NID_ct_cert_scts 201e71b7053SJung-uk Kim 202e71b7053SJung-uk Kim=head1 RETURN VALUES 203e71b7053SJung-uk Kim 204b077aed3SPierre ProncheryX509V3_get_d2i(), its variants, and X509V3_EXT_d2i() return 205b077aed3SPierre Proncherya pointer to an extension specific structure or NULL if an error occurs. 206e71b7053SJung-uk Kim 207b077aed3SPierre ProncheryX509V3_add1_i2d() and its variants return 1 if the operation is successful 208b077aed3SPierre Proncheryand 0 if it fails due to a non-fatal error (extension not found, already exists, 209e71b7053SJung-uk Kimcannot be encoded) or -1 due to a fatal error such as a memory allocation 210e71b7053SJung-uk Kimfailure. 211e71b7053SJung-uk Kim 212b077aed3SPierre ProncheryX509V3_EXT_i2d() returns a pointer to an B<X509_EXTENSION> structure 213b077aed3SPierre Proncheryor NULL if an error occurs. 214b077aed3SPierre Pronchery 215e71b7053SJung-uk KimX509_get0_extensions(), X509_CRL_get0_extensions() and 216e71b7053SJung-uk KimX509_REVOKED_get0_extensions() return a stack of extensions. They return 217e71b7053SJung-uk KimNULL if no extensions are present. 218e71b7053SJung-uk Kim 219e71b7053SJung-uk Kim=head1 SEE ALSO 220e71b7053SJung-uk Kim 221e71b7053SJung-uk KimL<d2i_X509(3)>, 222e71b7053SJung-uk KimL<ERR_get_error(3)>, 223e71b7053SJung-uk KimL<X509_CRL_get0_by_serial(3)>, 224e71b7053SJung-uk KimL<X509_get0_signature(3)>, 225e71b7053SJung-uk KimL<X509_get_ext_d2i(3)>, 226e71b7053SJung-uk KimL<X509_get_extension_flags(3)>, 227e71b7053SJung-uk KimL<X509_get_pubkey(3)>, 228e71b7053SJung-uk KimL<X509_get_subject_name(3)>, 229e71b7053SJung-uk KimL<X509_get_version(3)>, 230e71b7053SJung-uk KimL<X509_NAME_add_entry_by_txt(3)>, 231e71b7053SJung-uk KimL<X509_NAME_ENTRY_get_object(3)>, 232e71b7053SJung-uk KimL<X509_NAME_get_index_by_NID(3)>, 233e71b7053SJung-uk KimL<X509_NAME_print_ex(3)>, 234e71b7053SJung-uk KimL<X509_new(3)>, 235e71b7053SJung-uk KimL<X509_sign(3)>, 236e71b7053SJung-uk KimL<X509_verify_cert(3)> 237e71b7053SJung-uk Kim 238e71b7053SJung-uk Kim=head1 COPYRIGHT 239e71b7053SJung-uk Kim 240*a7148ab3SEnji CooperCopyright 2015-2024 The OpenSSL Project Authors. All Rights Reserved. 241e71b7053SJung-uk Kim 242b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 243e71b7053SJung-uk Kimthis file except in compliance with the License. You can obtain a copy 244e71b7053SJung-uk Kimin the file LICENSE in the source distribution or at 245e71b7053SJung-uk KimL<https://www.openssl.org/source/license.html>. 246e71b7053SJung-uk Kim 247e71b7053SJung-uk Kim=cut 248