Home | History | Annotate | Line # | Download | only in openssl
      1  1.1  christos /*
      2  1.1  christos  * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
      3  1.1  christos  *
      4  1.1  christos  * Licensed under the OpenSSL license (the "License").  You may not use
      5  1.1  christos  * this file except in compliance with the License.  You can obtain a copy
      6  1.1  christos  * in the file LICENSE in the source distribution or at
      7  1.1  christos  * https://www.openssl.org/source/license.html
      8  1.1  christos  */
      9  1.1  christos 
     10  1.1  christos #ifndef HEADER_CT_H
     11  1.1  christos # define HEADER_CT_H
     12  1.1  christos 
     13  1.1  christos # include <openssl/opensslconf.h>
     14  1.1  christos 
     15  1.1  christos # ifndef OPENSSL_NO_CT
     16  1.1  christos # include <openssl/ossl_typ.h>
     17  1.1  christos # include <openssl/safestack.h>
     18  1.1  christos # include <openssl/x509.h>
     19  1.1  christos # include <openssl/cterr.h>
     20  1.1  christos # ifdef  __cplusplus
     21  1.1  christos extern "C" {
     22  1.1  christos # endif
     23  1.1  christos 
     24  1.1  christos 
     25  1.1  christos /* Minimum RSA key size, from RFC6962 */
     26  1.1  christos # define SCT_MIN_RSA_BITS 2048
     27  1.1  christos 
     28  1.1  christos /* All hashes are SHA256 in v1 of Certificate Transparency */
     29  1.1  christos # define CT_V1_HASHLEN SHA256_DIGEST_LENGTH
     30  1.1  christos 
     31  1.1  christos typedef enum {
     32  1.1  christos     CT_LOG_ENTRY_TYPE_NOT_SET = -1,
     33  1.1  christos     CT_LOG_ENTRY_TYPE_X509 = 0,
     34  1.1  christos     CT_LOG_ENTRY_TYPE_PRECERT = 1
     35  1.1  christos } ct_log_entry_type_t;
     36  1.1  christos 
     37  1.1  christos typedef enum {
     38  1.1  christos     SCT_VERSION_NOT_SET = -1,
     39  1.1  christos     SCT_VERSION_V1 = 0
     40  1.1  christos } sct_version_t;
     41  1.1  christos 
     42  1.1  christos typedef enum {
     43  1.1  christos     SCT_SOURCE_UNKNOWN,
     44  1.1  christos     SCT_SOURCE_TLS_EXTENSION,
     45  1.1  christos     SCT_SOURCE_X509V3_EXTENSION,
     46  1.1  christos     SCT_SOURCE_OCSP_STAPLED_RESPONSE
     47  1.1  christos } sct_source_t;
     48  1.1  christos 
     49  1.1  christos typedef enum {
     50  1.1  christos     SCT_VALIDATION_STATUS_NOT_SET,
     51  1.1  christos     SCT_VALIDATION_STATUS_UNKNOWN_LOG,
     52  1.1  christos     SCT_VALIDATION_STATUS_VALID,
     53  1.1  christos     SCT_VALIDATION_STATUS_INVALID,
     54  1.1  christos     SCT_VALIDATION_STATUS_UNVERIFIED,
     55  1.1  christos     SCT_VALIDATION_STATUS_UNKNOWN_VERSION
     56  1.1  christos } sct_validation_status_t;
     57  1.1  christos 
     58  1.1  christos DEFINE_STACK_OF(SCT)
     59  1.1  christos DEFINE_STACK_OF(CTLOG)
     60  1.1  christos 
     61  1.1  christos /******************************************
     62  1.1  christos  * CT policy evaluation context functions *
     63  1.1  christos  ******************************************/
     64  1.1  christos 
     65  1.1  christos /*
     66  1.1  christos  * Creates a new, empty policy evaluation context.
     67  1.1  christos  * The caller is responsible for calling CT_POLICY_EVAL_CTX_free when finished
     68  1.1  christos  * with the CT_POLICY_EVAL_CTX.
     69  1.1  christos  */
     70  1.1  christos CT_POLICY_EVAL_CTX *CT_POLICY_EVAL_CTX_new(void);
     71  1.1  christos 
     72  1.1  christos /* Deletes a policy evaluation context and anything it owns. */
     73  1.1  christos void CT_POLICY_EVAL_CTX_free(CT_POLICY_EVAL_CTX *ctx);
     74  1.1  christos 
     75  1.1  christos /* Gets the peer certificate that the SCTs are for */
     76  1.1  christos X509* CT_POLICY_EVAL_CTX_get0_cert(const CT_POLICY_EVAL_CTX *ctx);
     77  1.1  christos 
     78  1.1  christos /*
     79  1.1  christos  * Sets the certificate associated with the received SCTs.
     80  1.1  christos  * Increments the reference count of cert.
     81  1.1  christos  * Returns 1 on success, 0 otherwise.
     82  1.1  christos  */
     83  1.1  christos int CT_POLICY_EVAL_CTX_set1_cert(CT_POLICY_EVAL_CTX *ctx, X509 *cert);
     84  1.1  christos 
     85  1.1  christos /* Gets the issuer of the aforementioned certificate */
     86  1.1  christos X509* CT_POLICY_EVAL_CTX_get0_issuer(const CT_POLICY_EVAL_CTX *ctx);
     87  1.1  christos 
     88  1.1  christos /*
     89  1.1  christos  * Sets the issuer of the certificate associated with the received SCTs.
     90  1.1  christos  * Increments the reference count of issuer.
     91  1.1  christos  * Returns 1 on success, 0 otherwise.
     92  1.1  christos  */
     93  1.1  christos int CT_POLICY_EVAL_CTX_set1_issuer(CT_POLICY_EVAL_CTX *ctx, X509 *issuer);
     94  1.1  christos 
     95  1.1  christos /* Gets the CT logs that are trusted sources of SCTs */
     96  1.1  christos const CTLOG_STORE *CT_POLICY_EVAL_CTX_get0_log_store(const CT_POLICY_EVAL_CTX *ctx);
     97  1.1  christos 
     98  1.1  christos /* Sets the log store that is in use. It must outlive the CT_POLICY_EVAL_CTX. */
     99  1.1  christos void CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE(CT_POLICY_EVAL_CTX *ctx,
    100  1.1  christos                                                CTLOG_STORE *log_store);
    101  1.1  christos 
    102  1.1  christos /*
    103  1.1  christos  * Gets the time, in milliseconds since the Unix epoch, that will be used as the
    104  1.1  christos  * current time when checking whether an SCT was issued in the future.
    105  1.1  christos  * Such SCTs will fail validation, as required by RFC6962.
    106  1.1  christos  */
    107  1.1  christos uint64_t CT_POLICY_EVAL_CTX_get_time(const CT_POLICY_EVAL_CTX *ctx);
    108  1.1  christos 
    109  1.1  christos /*
    110  1.1  christos  * Sets the time to evaluate SCTs against, in milliseconds since the Unix epoch.
    111  1.1  christos  * If an SCT's timestamp is after this time, it will be interpreted as having
    112  1.1  christos  * been issued in the future. RFC6962 states that "TLS clients MUST reject SCTs
    113  1.1  christos  * whose timestamp is in the future", so an SCT will not validate in this case.
    114  1.1  christos  */
    115  1.1  christos void CT_POLICY_EVAL_CTX_set_time(CT_POLICY_EVAL_CTX *ctx, uint64_t time_in_ms);
    116  1.1  christos 
    117  1.1  christos /*****************
    118  1.1  christos  * SCT functions *
    119  1.1  christos  *****************/
    120  1.1  christos 
    121  1.1  christos /*
    122  1.1  christos  * Creates a new, blank SCT.
    123  1.1  christos  * The caller is responsible for calling SCT_free when finished with the SCT.
    124  1.1  christos  */
    125  1.1  christos SCT *SCT_new(void);
    126  1.1  christos 
    127  1.1  christos /*
    128  1.1  christos  * Creates a new SCT from some base64-encoded strings.
    129  1.1  christos  * The caller is responsible for calling SCT_free when finished with the SCT.
    130  1.1  christos  */
    131  1.1  christos SCT *SCT_new_from_base64(unsigned char version,
    132  1.1  christos                          const char *logid_base64,
    133  1.1  christos                          ct_log_entry_type_t entry_type,
    134  1.1  christos                          uint64_t timestamp,
    135  1.1  christos                          const char *extensions_base64,
    136  1.1  christos                          const char *signature_base64);
    137  1.1  christos 
    138  1.1  christos /*
    139  1.1  christos  * Frees the SCT and the underlying data structures.
    140  1.1  christos  */
    141  1.1  christos void SCT_free(SCT *sct);
    142  1.1  christos 
    143  1.1  christos /*
    144  1.1  christos  * Free a stack of SCTs, and the underlying SCTs themselves.
    145  1.1  christos  * Intended to be compatible with X509V3_EXT_FREE.
    146  1.1  christos  */
    147  1.1  christos void SCT_LIST_free(STACK_OF(SCT) *a);
    148  1.1  christos 
    149  1.1  christos /*
    150  1.1  christos  * Returns the version of the SCT.
    151  1.1  christos  */
    152  1.1  christos sct_version_t SCT_get_version(const SCT *sct);
    153  1.1  christos 
    154  1.1  christos /*
    155  1.1  christos  * Set the version of an SCT.
    156  1.1  christos  * Returns 1 on success, 0 if the version is unrecognized.
    157  1.1  christos  */
    158  1.1  christos __owur int SCT_set_version(SCT *sct, sct_version_t version);
    159  1.1  christos 
    160  1.1  christos /*
    161  1.1  christos  * Returns the log entry type of the SCT.
    162  1.1  christos  */
    163  1.1  christos ct_log_entry_type_t SCT_get_log_entry_type(const SCT *sct);
    164  1.1  christos 
    165  1.1  christos /*
    166  1.1  christos  * Set the log entry type of an SCT.
    167  1.1  christos  * Returns 1 on success, 0 otherwise.
    168  1.1  christos  */
    169  1.1  christos __owur int SCT_set_log_entry_type(SCT *sct, ct_log_entry_type_t entry_type);
    170  1.1  christos 
    171  1.1  christos /*
    172  1.1  christos  * Gets the ID of the log that an SCT came from.
    173  1.1  christos  * Ownership of the log ID remains with the SCT.
    174  1.1  christos  * Returns the length of the log ID.
    175  1.1  christos  */
    176  1.1  christos size_t SCT_get0_log_id(const SCT *sct, unsigned char **log_id);
    177  1.1  christos 
    178  1.1  christos /*
    179  1.1  christos  * Set the log ID of an SCT to point directly to the *log_id specified.
    180  1.1  christos  * The SCT takes ownership of the specified pointer.
    181  1.1  christos  * Returns 1 on success, 0 otherwise.
    182  1.1  christos  */
    183  1.1  christos __owur int SCT_set0_log_id(SCT *sct, unsigned char *log_id, size_t log_id_len);
    184  1.1  christos 
    185  1.1  christos /*
    186  1.1  christos  * Set the log ID of an SCT.
    187  1.1  christos  * This makes a copy of the log_id.
    188  1.1  christos  * Returns 1 on success, 0 otherwise.
    189  1.1  christos  */
    190  1.1  christos __owur int SCT_set1_log_id(SCT *sct, const unsigned char *log_id,
    191  1.1  christos                            size_t log_id_len);
    192  1.1  christos 
    193  1.1  christos /*
    194  1.1  christos  * Returns the timestamp for the SCT (epoch time in milliseconds).
    195  1.1  christos  */
    196  1.1  christos uint64_t SCT_get_timestamp(const SCT *sct);
    197  1.1  christos 
    198  1.1  christos /*
    199  1.1  christos  * Set the timestamp of an SCT (epoch time in milliseconds).
    200  1.1  christos  */
    201  1.1  christos void SCT_set_timestamp(SCT *sct, uint64_t timestamp);
    202  1.1  christos 
    203  1.1  christos /*
    204  1.1  christos  * Return the NID for the signature used by the SCT.
    205  1.1  christos  * For CT v1, this will be either NID_sha256WithRSAEncryption or
    206  1.1  christos  * NID_ecdsa_with_SHA256 (or NID_undef if incorrect/unset).
    207  1.1  christos  */
    208  1.1  christos int SCT_get_signature_nid(const SCT *sct);
    209  1.1  christos 
    210  1.1  christos /*
    211  1.1  christos  * Set the signature type of an SCT
    212  1.1  christos  * For CT v1, this should be either NID_sha256WithRSAEncryption or
    213  1.1  christos  * NID_ecdsa_with_SHA256.
    214  1.1  christos  * Returns 1 on success, 0 otherwise.
    215  1.1  christos  */
    216  1.1  christos __owur int SCT_set_signature_nid(SCT *sct, int nid);
    217  1.1  christos 
    218  1.1  christos /*
    219  1.1  christos  * Set *ext to point to the extension data for the SCT. ext must not be NULL.
    220  1.1  christos  * The SCT retains ownership of this pointer.
    221  1.1  christos  * Returns length of the data pointed to.
    222  1.1  christos  */
    223  1.1  christos size_t SCT_get0_extensions(const SCT *sct, unsigned char **ext);
    224  1.1  christos 
    225  1.1  christos /*
    226  1.1  christos  * Set the extensions of an SCT to point directly to the *ext specified.
    227  1.1  christos  * The SCT takes ownership of the specified pointer.
    228  1.1  christos  */
    229  1.1  christos void SCT_set0_extensions(SCT *sct, unsigned char *ext, size_t ext_len);
    230  1.1  christos 
    231  1.1  christos /*
    232  1.1  christos  * Set the extensions of an SCT.
    233  1.1  christos  * This takes a copy of the ext.
    234  1.1  christos  * Returns 1 on success, 0 otherwise.
    235  1.1  christos  */
    236  1.1  christos __owur int SCT_set1_extensions(SCT *sct, const unsigned char *ext,
    237  1.1  christos                                size_t ext_len);
    238  1.1  christos 
    239  1.1  christos /*
    240  1.1  christos  * Set *sig to point to the signature for the SCT. sig must not be NULL.
    241  1.1  christos  * The SCT retains ownership of this pointer.
    242  1.1  christos  * Returns length of the data pointed to.
    243  1.1  christos  */
    244  1.1  christos size_t SCT_get0_signature(const SCT *sct, unsigned char **sig);
    245  1.1  christos 
    246  1.1  christos /*
    247  1.1  christos  * Set the signature of an SCT to point directly to the *sig specified.
    248  1.1  christos  * The SCT takes ownership of the specified pointer.
    249  1.1  christos  */
    250  1.1  christos void SCT_set0_signature(SCT *sct, unsigned char *sig, size_t sig_len);
    251  1.1  christos 
    252  1.1  christos /*
    253  1.1  christos  * Set the signature of an SCT to be a copy of the *sig specified.
    254  1.1  christos  * Returns 1 on success, 0 otherwise.
    255  1.1  christos  */
    256  1.1  christos __owur int SCT_set1_signature(SCT *sct, const unsigned char *sig,
    257  1.1  christos                               size_t sig_len);
    258  1.1  christos 
    259  1.1  christos /*
    260  1.1  christos  * The origin of this SCT, e.g. TLS extension, OCSP response, etc.
    261  1.1  christos  */
    262  1.1  christos sct_source_t SCT_get_source(const SCT *sct);
    263  1.1  christos 
    264  1.1  christos /*
    265  1.1  christos  * Set the origin of this SCT, e.g. TLS extension, OCSP response, etc.
    266  1.1  christos  * Returns 1 on success, 0 otherwise.
    267  1.1  christos  */
    268  1.1  christos __owur int SCT_set_source(SCT *sct, sct_source_t source);
    269  1.1  christos 
    270  1.1  christos /*
    271  1.1  christos  * Returns a text string describing the validation status of |sct|.
    272  1.1  christos  */
    273  1.1  christos const char *SCT_validation_status_string(const SCT *sct);
    274  1.1  christos 
    275  1.1  christos /*
    276  1.1  christos  * Pretty-prints an |sct| to |out|.
    277  1.1  christos  * It will be indented by the number of spaces specified by |indent|.
    278  1.1  christos  * If |logs| is not NULL, it will be used to lookup the CT log that the SCT came
    279  1.1  christos  * from, so that the log name can be printed.
    280  1.1  christos  */
    281  1.1  christos void SCT_print(const SCT *sct, BIO *out, int indent, const CTLOG_STORE *logs);
    282  1.1  christos 
    283  1.1  christos /*
    284  1.1  christos  * Pretty-prints an |sct_list| to |out|.
    285  1.1  christos  * It will be indented by the number of spaces specified by |indent|.
    286  1.1  christos  * SCTs will be delimited by |separator|.
    287  1.1  christos  * If |logs| is not NULL, it will be used to lookup the CT log that each SCT
    288  1.1  christos  * came from, so that the log names can be printed.
    289  1.1  christos  */
    290  1.1  christos void SCT_LIST_print(const STACK_OF(SCT) *sct_list, BIO *out, int indent,
    291  1.1  christos                     const char *separator, const CTLOG_STORE *logs);
    292  1.1  christos 
    293  1.1  christos /*
    294  1.1  christos  * Gets the last result of validating this SCT.
    295  1.1  christos  * If it has not been validated yet, returns SCT_VALIDATION_STATUS_NOT_SET.
    296  1.1  christos  */
    297  1.1  christos sct_validation_status_t SCT_get_validation_status(const SCT *sct);
    298  1.1  christos 
    299  1.1  christos /*
    300  1.1  christos  * Validates the given SCT with the provided context.
    301  1.1  christos  * Sets the "validation_status" field of the SCT.
    302  1.1  christos  * Returns 1 if the SCT is valid and the signature verifies.
    303  1.1  christos  * Returns 0 if the SCT is invalid or could not be verified.
    304  1.1  christos  * Returns -1 if an error occurs.
    305  1.1  christos  */
    306  1.1  christos __owur int SCT_validate(SCT *sct, const CT_POLICY_EVAL_CTX *ctx);
    307  1.1  christos 
    308  1.1  christos /*
    309  1.1  christos  * Validates the given list of SCTs with the provided context.
    310  1.1  christos  * Sets the "validation_status" field of each SCT.
    311  1.1  christos  * Returns 1 if there are no invalid SCTs and all signatures verify.
    312  1.1  christos  * Returns 0 if at least one SCT is invalid or could not be verified.
    313  1.1  christos  * Returns a negative integer if an error occurs.
    314  1.1  christos  */
    315  1.1  christos __owur int SCT_LIST_validate(const STACK_OF(SCT) *scts,
    316  1.1  christos                              CT_POLICY_EVAL_CTX *ctx);
    317  1.1  christos 
    318  1.1  christos 
    319  1.1  christos /*********************************
    320  1.1  christos  * SCT parsing and serialisation *
    321  1.1  christos  *********************************/
    322  1.1  christos 
    323  1.1  christos /*
    324  1.1  christos  * Serialize (to TLS format) a stack of SCTs and return the length.
    325  1.1  christos  * "a" must not be NULL.
    326  1.1  christos  * If "pp" is NULL, just return the length of what would have been serialized.
    327  1.1  christos  * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer
    328  1.1  christos  * for data that caller is responsible for freeing (only if function returns
    329  1.1  christos  * successfully).
    330  1.1  christos  * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring
    331  1.1  christos  * that "*pp" is large enough to accept all of the serialized data.
    332  1.1  christos  * Returns < 0 on error, >= 0 indicating bytes written (or would have been)
    333  1.1  christos  * on success.
    334  1.1  christos  */
    335  1.1  christos __owur int i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp);
    336  1.1  christos 
    337  1.1  christos /*
    338  1.1  christos  * Convert TLS format SCT list to a stack of SCTs.
    339  1.1  christos  * If "a" or "*a" is NULL, a new stack will be created that the caller is
    340  1.1  christos  * responsible for freeing (by calling SCT_LIST_free).
    341  1.1  christos  * "**pp" and "*pp" must not be NULL.
    342  1.1  christos  * Upon success, "*pp" will point to after the last bytes read, and a stack
    343  1.1  christos  * will be returned.
    344  1.1  christos  * Upon failure, a NULL pointer will be returned, and the position of "*pp" is
    345  1.1  christos  * not defined.
    346  1.1  christos  */
    347  1.1  christos STACK_OF(SCT) *o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp,
    348  1.1  christos                             size_t len);
    349  1.1  christos 
    350  1.1  christos /*
    351  1.1  christos  * Serialize (to DER format) a stack of SCTs and return the length.
    352  1.1  christos  * "a" must not be NULL.
    353  1.1  christos  * If "pp" is NULL, just returns the length of what would have been serialized.
    354  1.1  christos  * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer
    355  1.1  christos  * for data that caller is responsible for freeing (only if function returns
    356  1.1  christos  * successfully).
    357  1.1  christos  * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring
    358  1.1  christos  * that "*pp" is large enough to accept all of the serialized data.
    359  1.1  christos  * Returns < 0 on error, >= 0 indicating bytes written (or would have been)
    360  1.1  christos  * on success.
    361  1.1  christos  */
    362  1.1  christos __owur int i2d_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp);
    363  1.1  christos 
    364  1.1  christos /*
    365  1.1  christos  * Parses an SCT list in DER format and returns it.
    366  1.1  christos  * If "a" or "*a" is NULL, a new stack will be created that the caller is
    367  1.1  christos  * responsible for freeing (by calling SCT_LIST_free).
    368  1.1  christos  * "**pp" and "*pp" must not be NULL.
    369  1.1  christos  * Upon success, "*pp" will point to after the last bytes read, and a stack
    370  1.1  christos  * will be returned.
    371  1.1  christos  * Upon failure, a NULL pointer will be returned, and the position of "*pp" is
    372  1.1  christos  * not defined.
    373  1.1  christos  */
    374  1.1  christos STACK_OF(SCT) *d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp,
    375  1.1  christos                             long len);
    376  1.1  christos 
    377  1.1  christos /*
    378  1.1  christos  * Serialize (to TLS format) an |sct| and write it to |out|.
    379  1.1  christos  * If |out| is null, no SCT will be output but the length will still be returned.
    380  1.1  christos  * If |out| points to a null pointer, a string will be allocated to hold the
    381  1.1  christos  * TLS-format SCT. It is the responsibility of the caller to free it.
    382  1.1  christos  * If |out| points to an allocated string, the TLS-format SCT will be written
    383  1.1  christos  * to it.
    384  1.1  christos  * The length of the SCT in TLS format will be returned.
    385  1.1  christos  */
    386  1.1  christos __owur int i2o_SCT(const SCT *sct, unsigned char **out);
    387  1.1  christos 
    388  1.1  christos /*
    389  1.1  christos  * Parses an SCT in TLS format and returns it.
    390  1.1  christos  * If |psct| is not null, it will end up pointing to the parsed SCT. If it
    391  1.1  christos  * already points to a non-null pointer, the pointer will be free'd.
    392  1.1  christos  * |in| should be a pointer to a string containing the TLS-format SCT.
    393  1.1  christos  * |in| will be advanced to the end of the SCT if parsing succeeds.
    394  1.1  christos  * |len| should be the length of the SCT in |in|.
    395  1.1  christos  * Returns NULL if an error occurs.
    396  1.1  christos  * If the SCT is an unsupported version, only the SCT's 'sct' and 'sct_len'
    397  1.1  christos  * fields will be populated (with |in| and |len| respectively).
    398  1.1  christos  */
    399  1.1  christos SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len);
    400  1.1  christos 
    401  1.1  christos /********************
    402  1.1  christos  * CT log functions *
    403  1.1  christos  ********************/
    404  1.1  christos 
    405  1.1  christos /*
    406  1.1  christos  * Creates a new CT log instance with the given |public_key| and |name|.
    407  1.1  christos  * Takes ownership of |public_key| but copies |name|.
    408  1.1  christos  * Returns NULL if malloc fails or if |public_key| cannot be converted to DER.
    409  1.1  christos  * Should be deleted by the caller using CTLOG_free when no longer needed.
    410  1.1  christos  */
    411  1.1  christos CTLOG *CTLOG_new(EVP_PKEY *public_key, const char *name);
    412  1.1  christos 
    413  1.1  christos /*
    414  1.1  christos  * Creates a new CTLOG instance with the base64-encoded SubjectPublicKeyInfo DER
    415  1.1  christos  * in |pkey_base64|. The |name| is a string to help users identify this log.
    416  1.1  christos  * Returns 1 on success, 0 on failure.
    417  1.1  christos  * Should be deleted by the caller using CTLOG_free when no longer needed.
    418  1.1  christos  */
    419  1.1  christos int CTLOG_new_from_base64(CTLOG ** ct_log,
    420  1.1  christos                           const char *pkey_base64, const char *name);
    421  1.1  christos 
    422  1.1  christos /*
    423  1.1  christos  * Deletes a CT log instance and its fields.
    424  1.1  christos  */
    425  1.1  christos void CTLOG_free(CTLOG *log);
    426  1.1  christos 
    427  1.1  christos /* Gets the name of the CT log */
    428  1.1  christos const char *CTLOG_get0_name(const CTLOG *log);
    429  1.1  christos /* Gets the ID of the CT log */
    430  1.1  christos void CTLOG_get0_log_id(const CTLOG *log, const uint8_t **log_id,
    431  1.1  christos                        size_t *log_id_len);
    432  1.1  christos /* Gets the public key of the CT log */
    433  1.1  christos EVP_PKEY *CTLOG_get0_public_key(const CTLOG *log);
    434  1.1  christos 
    435  1.1  christos /**************************
    436  1.1  christos  * CT log store functions *
    437  1.1  christos  **************************/
    438  1.1  christos 
    439  1.1  christos /*
    440  1.1  christos  * Creates a new CT log store.
    441  1.1  christos  * Should be deleted by the caller using CTLOG_STORE_free when no longer needed.
    442  1.1  christos  */
    443  1.1  christos CTLOG_STORE *CTLOG_STORE_new(void);
    444  1.1  christos 
    445  1.1  christos /*
    446  1.1  christos  * Deletes a CT log store and all of the CT log instances held within.
    447  1.1  christos  */
    448  1.1  christos void CTLOG_STORE_free(CTLOG_STORE *store);
    449  1.1  christos 
    450  1.1  christos /*
    451  1.1  christos  * Finds a CT log in the store based on its log ID.
    452  1.1  christos  * Returns the CT log, or NULL if no match is found.
    453  1.1  christos  */
    454  1.1  christos const CTLOG *CTLOG_STORE_get0_log_by_id(const CTLOG_STORE *store,
    455  1.1  christos                                         const uint8_t *log_id,
    456  1.1  christos                                         size_t log_id_len);
    457  1.1  christos 
    458  1.1  christos /*
    459  1.1  christos  * Loads a CT log list into a |store| from a |file|.
    460  1.1  christos  * Returns 1 if loading is successful, or 0 otherwise.
    461  1.1  christos  */
    462  1.1  christos __owur int CTLOG_STORE_load_file(CTLOG_STORE *store, const char *file);
    463  1.1  christos 
    464  1.1  christos /*
    465  1.1  christos  * Loads the default CT log list into a |store|.
    466  1.1  christos  * Returns 1 if loading is successful, or 0 otherwise.
    467  1.1  christos  */
    468  1.1  christos __owur int CTLOG_STORE_load_default_file(CTLOG_STORE *store);
    469  1.1  christos 
    470  1.1  christos #  ifdef  __cplusplus
    471  1.1  christos }
    472  1.1  christos #  endif
    473  1.1  christos # endif
    474  1.1  christos #endif
    475