Home | History | Annotate | Line # | Download | only in openssl
      1 /*
      2  * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the OpenSSL license (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 #ifndef HEADER_DRBG_RAND_H
     11 # define HEADER_DRBG_RAND_H
     12 
     13 # include <time.h>
     14 # include <openssl/ossl_typ.h>
     15 # include <openssl/obj_mac.h>
     16 
     17 /*
     18  * RAND_DRBG  flags
     19  *
     20  * Note: if new flags are added, the constant `rand_drbg_used_flags`
     21  *       in drbg_lib.c needs to be updated accordingly.
     22  */
     23 
     24 /* In CTR mode, disable derivation function ctr_df */
     25 # define RAND_DRBG_FLAG_CTR_NO_DF            0x1
     26 
     27 
     28 # if OPENSSL_API_COMPAT < 0x10200000L
     29 /* This #define was replaced by an internal constant and should not be used. */
     30 #  define RAND_DRBG_USED_FLAGS  (RAND_DRBG_FLAG_CTR_NO_DF)
     31 # endif
     32 
     33 /*
     34  * Default security strength (in the sense of [NIST SP 800-90Ar1])
     35  *
     36  * NIST SP 800-90Ar1 supports the strength of the DRBG being smaller than that
     37  * of the cipher by collecting less entropy. The current DRBG implementation
     38  * does not take RAND_DRBG_STRENGTH into account and sets the strength of the
     39  * DRBG to that of the cipher.
     40  *
     41  * RAND_DRBG_STRENGTH is currently only used for the legacy RAND
     42  * implementation.
     43  *
     44  * Currently supported ciphers are: NID_aes_128_ctr, NID_aes_192_ctr and
     45  * NID_aes_256_ctr
     46  */
     47 # define RAND_DRBG_STRENGTH             256
     48 /* Default drbg type */
     49 # define RAND_DRBG_TYPE                 NID_aes_256_ctr
     50 /* Default drbg flags */
     51 # define RAND_DRBG_FLAGS                0
     52 
     53 
     54 # ifdef  __cplusplus
     55 extern "C" {
     56 # endif
     57 
     58 /*
     59  * Object lifetime functions.
     60  */
     61 RAND_DRBG *RAND_DRBG_new(int type, unsigned int flags, RAND_DRBG *parent);
     62 RAND_DRBG *RAND_DRBG_secure_new(int type, unsigned int flags, RAND_DRBG *parent);
     63 int RAND_DRBG_set(RAND_DRBG *drbg, int type, unsigned int flags);
     64 int RAND_DRBG_set_defaults(int type, unsigned int flags);
     65 int RAND_DRBG_instantiate(RAND_DRBG *drbg,
     66                           const unsigned char *pers, size_t perslen);
     67 int RAND_DRBG_uninstantiate(RAND_DRBG *drbg);
     68 void RAND_DRBG_free(RAND_DRBG *drbg);
     69 
     70 /*
     71  * Object "use" functions.
     72  */
     73 int RAND_DRBG_reseed(RAND_DRBG *drbg,
     74                      const unsigned char *adin, size_t adinlen,
     75                      int prediction_resistance);
     76 int RAND_DRBG_generate(RAND_DRBG *drbg, unsigned char *out, size_t outlen,
     77                        int prediction_resistance,
     78                        const unsigned char *adin, size_t adinlen);
     79 int RAND_DRBG_bytes(RAND_DRBG *drbg, unsigned char *out, size_t outlen);
     80 
     81 int RAND_DRBG_set_reseed_interval(RAND_DRBG *drbg, unsigned int interval);
     82 int RAND_DRBG_set_reseed_time_interval(RAND_DRBG *drbg, time_t interval);
     83 
     84 int RAND_DRBG_set_reseed_defaults(
     85                                   unsigned int master_reseed_interval,
     86                                   unsigned int slave_reseed_interval,
     87                                   time_t master_reseed_time_interval,
     88                                   time_t slave_reseed_time_interval
     89                                   );
     90 
     91 RAND_DRBG *RAND_DRBG_get0_master(void);
     92 RAND_DRBG *RAND_DRBG_get0_public(void);
     93 RAND_DRBG *RAND_DRBG_get0_private(void);
     94 
     95 /*
     96  * EXDATA
     97  */
     98 # define RAND_DRBG_get_ex_new_index(l, p, newf, dupf, freef) \
     99     CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DRBG, l, p, newf, dupf, freef)
    100 int RAND_DRBG_set_ex_data(RAND_DRBG *drbg, int idx, void *arg);
    101 void *RAND_DRBG_get_ex_data(const RAND_DRBG *drbg, int idx);
    102 
    103 /*
    104  * Callback function typedefs
    105  */
    106 typedef size_t (*RAND_DRBG_get_entropy_fn)(RAND_DRBG *drbg,
    107                                            unsigned char **pout,
    108                                            int entropy, size_t min_len,
    109                                            size_t max_len,
    110                                            int prediction_resistance);
    111 typedef void (*RAND_DRBG_cleanup_entropy_fn)(RAND_DRBG *ctx,
    112                                              unsigned char *out, size_t outlen);
    113 typedef size_t (*RAND_DRBG_get_nonce_fn)(RAND_DRBG *drbg, unsigned char **pout,
    114                                          int entropy, size_t min_len,
    115                                          size_t max_len);
    116 typedef void (*RAND_DRBG_cleanup_nonce_fn)(RAND_DRBG *drbg,
    117                                            unsigned char *out, size_t outlen);
    118 
    119 int RAND_DRBG_set_callbacks(RAND_DRBG *drbg,
    120                             RAND_DRBG_get_entropy_fn get_entropy,
    121                             RAND_DRBG_cleanup_entropy_fn cleanup_entropy,
    122                             RAND_DRBG_get_nonce_fn get_nonce,
    123                             RAND_DRBG_cleanup_nonce_fn cleanup_nonce);
    124 
    125 
    126 # ifdef  __cplusplus
    127 }
    128 # endif
    129 
    130 #endif
    131