2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
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
10 #ifndef HEADER_RAND_LCL_H
11 # define HEADER_RAND_LCL_H
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 "internal/rand.h"
20 /* we require 256 bits of randomness */
21 # define RANDOMNESS_NEEDED (256 / 8)
23 /* Maximum count allowed in reseeding */
24 #define MAX_RESEED (1 << 24)
26 /* DRBG status values */
27 #define DRBG_STATUS_UNINITIALISED 0
28 #define DRBG_STATUS_READY 1
29 #define DRBG_STATUS_RESEED 2
30 #define DRBG_STATUS_ERROR 3
32 /* A default maximum length: larger than any reasonable value used in pratice */
33 #define DRBG_MAX_LENGTH 0x7ffffff0
35 typedef struct drbg_ctr_ctx_st {
40 /* Temp variables used by derivation function */
43 /* Temporary block storage used by ctr_df */
44 unsigned char bltmp[16];
52 int nid; /* the NID of the underlying algorithm */
53 unsigned int flags; /* various external flags */
55 /* The following parameters are setup by mechanism drbg_init() call */
59 size_t min_entropy, max_entropy;
60 size_t min_nonce, max_nonce;
61 size_t max_pers, max_adin;
62 unsigned int reseed_counter;
63 unsigned int reseed_interval;
67 /* Application data: typically (only?) used by test get_entropy */
68 CRYPTO_EX_DATA ex_data;
70 /* Implementation specific structures */
73 /* entropy gathering function */
74 RAND_DRBG_get_entropy_fn get_entropy;
75 /* Indicates we have finished with entropy buffer */
76 RAND_DRBG_cleanup_entropy_fn cleanup_entropy;
77 /* nonce gathering function */
78 RAND_DRBG_get_nonce_fn get_nonce;
79 /* Indicates we have finished with nonce buffer */
80 RAND_DRBG_cleanup_nonce_fn cleanup_nonce;
84 extern RAND_METHOD openssl_rand_meth;
85 void rand_drbg_cleanup(void);
87 int ctr_init(DRBG_CTX *dctx);
88 int drbg_hash_init(DRBG_CTX *dctx);
89 int drbg_hmac_init(DRBG_CTX *dctx);
90 int ctr_uninstantiate(DRBG_CTX *dctx);
91 int ctr_instantiate(DRBG_CTX *dctx,
92 const unsigned char *ent, size_t entlen,
93 const unsigned char *nonce, size_t noncelen,
94 const unsigned char *pers, size_t perslen);
95 int ctr_reseed(DRBG_CTX *dctx,
96 const unsigned char *ent, size_t entlen,
97 const unsigned char *adin, size_t adinlen);
98 int ctr_generate(DRBG_CTX *dctx,
99 unsigned char *out, size_t outlen,
100 const unsigned char *adin, size_t adinlen);