CRNGT: continuous DRBG tests for providers
[openssl.git] / crypto / rand / rand_local.h
1 /*
2  * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (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 OSSL_CRYPTO_RAND_LOCAL_H
11 # define OSSL_CRYPTO_RAND_LOCAL_H
12
13 # include <openssl/aes.h>
14 # include <openssl/evp.h>
15 # include <openssl/sha.h>
16 # include <openssl/hmac.h>
17 # include <openssl/ec.h>
18 # include <openssl/rand_drbg.h>
19 # include "internal/tsan_assist.h"
20 # include "crypto/rand.h"
21 # include "crypto/rand_pool.h"
22
23 # include "internal/numbers.h"
24
25 /* Maximum reseed intervals */
26 # define MAX_RESEED_INTERVAL                     (1 << 24)
27 # define MAX_RESEED_TIME_INTERVAL                (1 << 20) /* approx. 12 days */
28
29 /* Default reseed intervals */
30 # define MASTER_RESEED_INTERVAL                  (1 << 8)
31 # define SLAVE_RESEED_INTERVAL                   (1 << 16)
32 # define MASTER_RESEED_TIME_INTERVAL             (60 * 60) /* 1 hour */
33 # define SLAVE_RESEED_TIME_INTERVAL              (7 * 60)  /* 7 minutes */
34
35 /*
36  * The number of bytes that constitutes an atomic lump of entropy with respect
37  * to the FIPS 140-2 section 4.9.2 Conditional Tests.  The size is somewhat
38  * arbitrary, the smaller the value, the less entropy is consumed on first
39  * read but the higher the probability of the test failing by accident.
40  *
41  * The value is in bytes.
42  */
43 #define CRNGT_BUFSIZ    16
44
45 /*
46  * Maximum input size for the DRBG (entropy, nonce, personalization string)
47  *
48  * NIST SP800 90Ar1 allows a maximum of (1 << 35) bits i.e., (1 << 32) bytes.
49  *
50  * We lower it to 'only' INT32_MAX bytes, which is equivalent to 2 gigabytes.
51  */
52 # define DRBG_MAX_LENGTH                         INT32_MAX
53
54 /* DRBG status values */
55 typedef enum drbg_status_e {
56     DRBG_UNINITIALISED,
57     DRBG_READY,
58     DRBG_ERROR
59 } DRBG_STATUS;
60
61 /* instantiate */
62 typedef int (*RAND_DRBG_instantiate_fn)(RAND_DRBG *ctx,
63                                         const unsigned char *ent,
64                                         size_t entlen,
65                                         const unsigned char *nonce,
66                                         size_t noncelen,
67                                         const unsigned char *pers,
68                                         size_t perslen);
69 /* reseed */
70 typedef int (*RAND_DRBG_reseed_fn)(RAND_DRBG *ctx,
71                                    const unsigned char *ent,
72                                    size_t entlen,
73                                    const unsigned char *adin,
74                                    size_t adinlen);
75 /* generate output */
76 typedef int (*RAND_DRBG_generate_fn)(RAND_DRBG *ctx,
77                                      unsigned char *out,
78                                      size_t outlen,
79                                      const unsigned char *adin,
80                                      size_t adinlen);
81 /* uninstantiate */
82 typedef int (*RAND_DRBG_uninstantiate_fn)(RAND_DRBG *ctx);
83
84
85 /*
86  * The state of all types of DRBGs, even though we only have CTR mode
87  * right now.
88  */
89 struct rand_drbg_st {
90     CRYPTO_RWLOCK *lock;
91     /* The library context this DRBG is associated with, if any */
92     OPENSSL_CTX *libctx;
93     RAND_DRBG *parent;
94     int secure; /* 1: allocated on the secure heap, 0: otherwise */
95     int type; /* the nid of the underlying algorithm */
96     unsigned short flags; /* various external flags */
97
98     /* Application data, mainly used in the KATs. */
99     CRYPTO_EX_DATA ex_data;
100
101     /* Implementation */
102     EVP_RAND_CTX *rand;
103
104     /* Callback functions.  See comments in rand_lib.c */
105     RAND_DRBG_get_entropy_fn get_entropy;
106     RAND_DRBG_cleanup_entropy_fn cleanup_entropy;
107     RAND_DRBG_get_nonce_fn get_nonce;
108     RAND_DRBG_cleanup_nonce_fn cleanup_nonce;
109
110     void *callback_data;
111 };
112
113 /* The global RAND method, and the global buffer and DRBG instance. */
114 extern RAND_METHOD rand_meth;
115
116 /* DRBG helpers */
117 int rand_drbg_restart(RAND_DRBG *drbg,
118                       const unsigned char *buffer, size_t len, size_t entropy);
119 size_t rand_drbg_seedlen(RAND_DRBG *drbg);
120
121 /*
122  * Entropy call back for the FIPS 140-2 section 4.9.2 Conditional Tests.
123  * These need to be exposed for the unit tests.
124  */
125 int rand_crngt_get_entropy_cb(OPENSSL_CTX *ctx, RAND_POOL *pool,
126                               unsigned char *buf, unsigned char *md,
127                               unsigned int *md_size);
128 extern int (*crngt_get_entropy)(OPENSSL_CTX *ctx, RAND_POOL *pool,
129                                 unsigned char *buf, unsigned char *md,
130                                 unsigned int *md_size);
131
132 #endif