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 /* Amount of randomness (in bytes) we want for initial seeding. */
21 # define RANDOMNESS_NEEDED (128 / 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
36 * The context for DRBG AES-CTR
38 typedef struct drbg_ctr_ctx_st
{
43 /* Temp variables used by derivation function */
46 /* Temporary block storage used by ctr_df */
47 unsigned char bltmp
[16];
54 * The context for all DRBG's
59 int nid
; /* the NID of the underlying algorithm */
60 unsigned int flags
; /* various external flags */
62 /* The following parameters are setup by mechanism drbg_init() call */
66 size_t min_entropy
, max_entropy
;
67 size_t min_nonce
, max_nonce
;
68 size_t max_pers
, max_adin
;
69 unsigned int reseed_counter
;
70 unsigned int reseed_interval
;
74 /* Application data: typically (only?) used by test get_entropy */
75 CRYPTO_EX_DATA ex_data
;
77 /* Implementation specific structures */
80 /* entropy gathering function */
81 RAND_DRBG_get_entropy_fn get_entropy
;
82 /* Indicates we have finished with entropy buffer */
83 RAND_DRBG_cleanup_entropy_fn cleanup_entropy
;
84 /* nonce gathering function */
85 RAND_DRBG_get_nonce_fn get_nonce
;
86 /* Indicates we have finished with nonce buffer */
87 RAND_DRBG_cleanup_nonce_fn cleanup_nonce
;
91 extern RAND_METHOD openssl_rand_meth
;
92 void rand_drbg_cleanup(void);
94 /* Hardware-based seeding functions. */
95 void rand_rdtsc(void);
98 /* DRBG functions implementing AES-CTR */
99 int ctr_init(DRBG_CTX
*dctx
);
100 int ctr_uninstantiate(DRBG_CTX
*dctx
);
101 int ctr_instantiate(DRBG_CTX
*dctx
,
102 const unsigned char *ent
, size_t entlen
,
103 const unsigned char *nonce
, size_t noncelen
,
104 const unsigned char *pers
, size_t perslen
);
105 int ctr_reseed(DRBG_CTX
*dctx
,
106 const unsigned char *ent
, size_t entlen
,
107 const unsigned char *adin
, size_t adinlen
);
108 int ctr_generate(DRBG_CTX
*dctx
,
109 unsigned char *out
, size_t outlen
,
110 const unsigned char *adin
, size_t adinlen
);