rand_lcl.h 5.0 KB
Newer Older
R
Rich Salz 已提交
1 2
/*
 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3
 *
R
Rich Salz 已提交
4 5 6 7
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
8 9 10
 */

#ifndef HEADER_RAND_LCL_H
11
# define HEADER_RAND_LCL_H
12

R
Rich Salz 已提交
13 14 15 16 17
# include <openssl/aes.h>
# include <openssl/evp.h>
# include <openssl/sha.h>
# include <openssl/hmac.h>
# include <openssl/ec.h>
R
Richard Levitte 已提交
18
# include "internal/rand.h"
R
Rich Salz 已提交
19

R
Rich Salz 已提交
20 21 22 23 24 25 26 27 28 29
/*
 * Amount of randomness (in bytes) we want for initial seeding.
 * This is based on the fact that we use AES-128 as the CRBG, and
 * that we use the derivation function.  If either of those changes,
 * (see rand_init() in rand_lib.c), change this.
 */
# define RANDOMNESS_NEEDED              16

/* Maximum amount of randomness to hold in RAND_BYTES_BUFFER. */
# define MAX_RANDOMNESS_HELD            (4 * RANDOMNESS_NEEDED)
30

31
/* Maximum count allowed in reseeding */
R
Rich Salz 已提交
32
# define MAX_RESEED                     (1 << 24)
33

R
Rich Salz 已提交
34 35
/* How often we call RAND_poll() in drbg_entropy_from_system */
# define RAND_POLL_RETRIES 8
R
Rich Salz 已提交
36

R
Rich Salz 已提交
37
/* Max size of entropy, addin, etc. Larger than any reasonable value */
R
Rich Salz 已提交
38
# define DRBG_MAX_LENGTH                0x7ffffff0
R
Rich Salz 已提交
39

R
Rich Salz 已提交
40 41 42 43 44 45 46 47 48 49

/* DRBG status values */
typedef enum drbg_status_e {
    DRBG_UNINITIALISED,
    DRBG_READY,
    DRBG_RESEED,
    DRBG_ERROR
} DRBG_STATUS;


R
Rich Salz 已提交
50
/*
R
Rich Salz 已提交
51 52 53 54 55 56
 * A buffer of random bytes to be fed as "entropy" into the DRBG.  RAND_add()
 * adds data to the buffer, and the drbg_entropy_from_system() pulls data from
 * the buffer. We have a separate data structure because of the way the
 * API is defined; otherwise we'd run into deadlocks (RAND_bytes ->
 * RAND_DRBG_generate* -> drbg_entropy_from_system -> RAND_poll -> RAND_add ->
 * drbg_add*; the functions with an asterisk lock).
R
Rich Salz 已提交
57
 */
R
Rich Salz 已提交
58 59 60 61 62 63 64 65 66 67 68
typedef struct rand_bytes_buffer_st {
    CRYPTO_RWLOCK *lock;
    size_t size;
    size_t curr;
    unsigned char *buff;
} RAND_BYTES_BUFFER;

/*
 * The state of a DRBG AES-CTR.
 */
typedef struct rand_drbg_ctr_st {
R
Rich Salz 已提交
69 70 71 72 73 74 75 76 77 78 79
    AES_KEY ks;
    size_t keylen;
    unsigned char K[32];
    unsigned char V[16];
    /* Temp variables used by derivation function */
    AES_KEY df_ks;
    AES_KEY df_kxks;
    /* Temporary block storage used by ctr_df */
    unsigned char bltmp[16];
    size_t bltmp_pos;
    unsigned char KX[48];
R
Rich Salz 已提交
80
} RAND_DRBG_CTR;
R
Rich Salz 已提交
81

R
Rich Salz 已提交
82 83

/*
R
Rich Salz 已提交
84 85
 * The state of all types of DRBGs, even though we only have CTR mode
 * right now.
R
Rich Salz 已提交
86
 */
R
Rich Salz 已提交
87
struct rand_drbg_st {
R
Rich Salz 已提交
88
    CRYPTO_RWLOCK *lock;
R
Rich Salz 已提交
89 90
    RAND_DRBG *parent;
    int nid; /* the underlying algorithm */
R
Rich Salz 已提交
91
    int fork_count;
R
Rich Salz 已提交
92 93 94 95 96 97 98 99 100 101
    unsigned short flags; /* various external flags */
    unsigned short filled;
    /*
     * This is a fixed-size buffer, but we malloc to make it a little
     * harder to find; a classic security/performance trade-off.
     */
    int size;
    unsigned char *randomness;

    /* These parameters are setup by the per-type "init" function. */
R
Rich Salz 已提交
102 103 104 105 106 107 108 109
    int strength;
    size_t max_request;
    size_t min_entropy, max_entropy;
    size_t min_nonce, max_nonce;
    size_t max_pers, max_adin;
    unsigned int reseed_counter;
    unsigned int reseed_interval;
    size_t seedlen;
R
Rich Salz 已提交
110
    DRBG_STATUS state;
R
Rich Salz 已提交
111

R
Rich Salz 已提交
112
    /* Application data, mainly used in the KATs. */
R
Rich Salz 已提交
113 114
    CRYPTO_EX_DATA ex_data;

R
Rich Salz 已提交
115 116
    /* Implementation specific structures; was a union, but inline for now */
    RAND_DRBG_CTR ctr;
R
Rich Salz 已提交
117

R
Rich Salz 已提交
118
    /* Callback functions.  See comments in rand_lib.c */
B
Benjamin Kaduk 已提交
119 120 121 122
    RAND_DRBG_get_entropy_fn get_entropy;
    RAND_DRBG_cleanup_entropy_fn cleanup_entropy;
    RAND_DRBG_get_nonce_fn get_nonce;
    RAND_DRBG_cleanup_nonce_fn cleanup_nonce;
R
Rich Salz 已提交
123
};
R
Rich Salz 已提交
124

R
Rich Salz 已提交
125 126 127 128
/* The global RAND method, and the global buffer and DRBG instance. */
extern RAND_METHOD rand_meth;
extern RAND_BYTES_BUFFER rand_bytes;
extern RAND_DRBG rand_drbg;
129
extern RAND_DRBG priv_drbg;
R
Rich Salz 已提交
130

R
Rich Salz 已提交
131 132 133
/* How often we've forked (only incremented in child). */
extern int rand_fork_count;

R
Rich Salz 已提交
134
/* Hardware-based seeding functions. */
R
Rich Salz 已提交
135 136 137 138 139 140 141 142 143 144 145
void rand_read_tsc(RAND_poll_fn cb, void *arg);
int rand_read_cpu(RAND_poll_fn cb, void *arg);

/* DRBG entropy callbacks. */
void drbg_release_entropy(RAND_DRBG *drbg, unsigned char *out);
size_t drbg_entropy_from_parent(RAND_DRBG *drbg,
                                unsigned char **pout,
                                int entropy, size_t min_len, size_t max_len);
size_t drbg_entropy_from_system(RAND_DRBG *drbg,
                                unsigned char **pout,
                                int entropy, size_t min_len, size_t max_len);
R
Rich Salz 已提交
146 147

/* DRBG functions implementing AES-CTR */
R
Rich Salz 已提交
148 149 150
int ctr_init(RAND_DRBG *drbg);
int ctr_uninstantiate(RAND_DRBG *drbg);
int ctr_instantiate(RAND_DRBG *drbg,
R
Rich Salz 已提交
151 152 153
                    const unsigned char *ent, size_t entlen,
                    const unsigned char *nonce, size_t noncelen,
                    const unsigned char *pers, size_t perslen);
R
Rich Salz 已提交
154
int ctr_reseed(RAND_DRBG *drbg,
R
Rich Salz 已提交
155 156
               const unsigned char *ent, size_t entlen,
               const unsigned char *adin, size_t adinlen);
R
Rich Salz 已提交
157
int ctr_generate(RAND_DRBG *drbg,
R
Rich Salz 已提交
158 159
                 unsigned char *out, size_t outlen,
                 const unsigned char *adin, size_t adinlen);
160 161

#endif