blob: 6c64e3e4e150681735e2fbf49f4eb5c0c7b4026e [file] [log] [blame]
Antonio de Angelis8bb98512024-01-16 14:13:36 +00001/**
2 * \file entropy.h
3 *
4 * \brief Entropy accumulator implementation
5 */
6/*
7 * Copyright The Mbed TLS Contributors
8 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
9 */
10#ifndef MBEDTLS_ENTROPY_H
11#define MBEDTLS_ENTROPY_H
12#include "mbedtls/private_access.h"
13
14#include "mbedtls/build_info.h"
15
16#include <stddef.h>
17
18#include "md.h"
19
David Vincze485c5ac2025-03-21 11:14:56 +000020#if (defined(MBEDTLS_MD_CAN_SHA512) || defined(PSA_WANT_ALG_SHA_512)) && \
21 !defined(MBEDTLS_ENTROPY_FORCE_SHA256)
Antonio de Angelis8bb98512024-01-16 14:13:36 +000022#define MBEDTLS_ENTROPY_SHA512_ACCUMULATOR
23#define MBEDTLS_ENTROPY_MD MBEDTLS_MD_SHA512
24#define MBEDTLS_ENTROPY_BLOCK_SIZE 64 /**< Block size of entropy accumulator (SHA-512) */
25#else
David Vincze485c5ac2025-03-21 11:14:56 +000026#if (defined(MBEDTLS_MD_CAN_SHA256) || defined(PSA_WANT_ALG_SHA_256))
Antonio de Angelis8bb98512024-01-16 14:13:36 +000027#define MBEDTLS_ENTROPY_SHA256_ACCUMULATOR
28#define MBEDTLS_ENTROPY_MD MBEDTLS_MD_SHA256
29#define MBEDTLS_ENTROPY_BLOCK_SIZE 32 /**< Block size of entropy accumulator (SHA-256) */
30#endif
31#endif
32
33#if defined(MBEDTLS_THREADING_C)
34#include "mbedtls/threading.h"
35#endif
36
37
38/** Critical entropy source failure. */
39#define MBEDTLS_ERR_ENTROPY_SOURCE_FAILED -0x003C
40/** No more sources can be added. */
41#define MBEDTLS_ERR_ENTROPY_MAX_SOURCES -0x003E
42/** No sources have been added to poll. */
43#define MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED -0x0040
44/** No strong sources have been added to poll. */
45#define MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE -0x003D
46/** Read/write error in file. */
47#define MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR -0x003F
48
49/**
50 * \name SECTION: Module settings
51 *
52 * The configuration options you can set for this module are in this section.
53 * Either change them in mbedtls_config.h or define them on the compiler command line.
54 * \{
55 */
56
57#if !defined(MBEDTLS_ENTROPY_MAX_SOURCES)
58#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */
59#endif
60
61#if !defined(MBEDTLS_ENTROPY_MAX_GATHER)
62#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */
63#endif
64
65/** \} name SECTION: Module settings */
66
67#define MBEDTLS_ENTROPY_MAX_SEED_SIZE 1024 /**< Maximum size of seed we read from seed file */
68#define MBEDTLS_ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_MAX_SOURCES
69
70#define MBEDTLS_ENTROPY_SOURCE_STRONG 1 /**< Entropy source is strong */
71#define MBEDTLS_ENTROPY_SOURCE_WEAK 0 /**< Entropy source is weak */
72
73#ifdef __cplusplus
74extern "C" {
75#endif
76
77/**
78 * \brief Entropy poll callback pointer
79 *
80 * \param data Callback-specific data pointer
81 * \param output Data to fill
82 * \param len Maximum size to provide
83 * \param olen The actual amount of bytes put into the buffer (Can be 0)
84 *
85 * \return 0 if no critical failures occurred,
86 * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED otherwise
87 */
88typedef int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, size_t len,
89 size_t *olen);
90
91/**
92 * \brief Entropy source state
93 */
94typedef struct mbedtls_entropy_source_state {
95 mbedtls_entropy_f_source_ptr MBEDTLS_PRIVATE(f_source); /**< The entropy source callback */
96 void *MBEDTLS_PRIVATE(p_source); /**< The callback data pointer */
97 size_t MBEDTLS_PRIVATE(size); /**< Amount received in bytes */
98 size_t MBEDTLS_PRIVATE(threshold); /**< Minimum bytes required before release */
99 int MBEDTLS_PRIVATE(strong); /**< Is the source strong? */
100}
101mbedtls_entropy_source_state;
102
103/**
104 * \brief Entropy context structure
105 */
106typedef struct mbedtls_entropy_context {
107 mbedtls_md_context_t MBEDTLS_PRIVATE(accumulator);
108 int MBEDTLS_PRIVATE(accumulator_started); /* 0 after init.
109 * 1 after the first update.
110 * -1 after free. */
111 int MBEDTLS_PRIVATE(source_count); /* Number of entries used in source. */
112 mbedtls_entropy_source_state MBEDTLS_PRIVATE(source)[MBEDTLS_ENTROPY_MAX_SOURCES];
113#if defined(MBEDTLS_THREADING_C)
114 mbedtls_threading_mutex_t MBEDTLS_PRIVATE(mutex); /*!< mutex */
115#endif
116#if defined(MBEDTLS_ENTROPY_NV_SEED)
117 int MBEDTLS_PRIVATE(initial_entropy_run);
118#endif
119}
120mbedtls_entropy_context;
121
122#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
123/**
124 * \brief Platform-specific entropy poll callback
125 */
126int mbedtls_platform_entropy_poll(void *data,
127 unsigned char *output, size_t len, size_t *olen);
128#endif
129
130/**
131 * \brief Initialize the context
132 *
133 * \param ctx Entropy context to initialize
134 */
135void mbedtls_entropy_init(mbedtls_entropy_context *ctx);
136
137/**
138 * \brief Free the data in the context
139 *
140 * \param ctx Entropy context to free
141 */
142void mbedtls_entropy_free(mbedtls_entropy_context *ctx);
143
144/**
145 * \brief Adds an entropy source to poll
146 * (Thread-safe if MBEDTLS_THREADING_C is enabled)
147 *
148 * \param ctx Entropy context
149 * \param f_source Entropy function
150 * \param p_source Function data
151 * \param threshold Minimum required from source before entropy is released
152 * ( with mbedtls_entropy_func() ) (in bytes)
153 * \param strong MBEDTLS_ENTROPY_SOURCE_STRONG or
154 * MBEDTLS_ENTROPY_SOURCE_WEAK.
155 * At least one strong source needs to be added.
156 * Weaker sources (such as the cycle counter) can be used as
157 * a complement.
158 *
159 * \return 0 if successful or MBEDTLS_ERR_ENTROPY_MAX_SOURCES
160 */
161int mbedtls_entropy_add_source(mbedtls_entropy_context *ctx,
162 mbedtls_entropy_f_source_ptr f_source, void *p_source,
163 size_t threshold, int strong);
164
165/**
166 * \brief Trigger an extra gather poll for the accumulator
167 * (Thread-safe if MBEDTLS_THREADING_C is enabled)
168 *
169 * \param ctx Entropy context
170 *
171 * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED
172 */
173int mbedtls_entropy_gather(mbedtls_entropy_context *ctx);
174
175/**
176 * \brief Retrieve entropy from the accumulator
177 * (Maximum length: MBEDTLS_ENTROPY_BLOCK_SIZE)
178 * (Thread-safe if MBEDTLS_THREADING_C is enabled)
179 *
180 * \param data Entropy context
181 * \param output Buffer to fill
182 * \param len Number of bytes desired, must be at most MBEDTLS_ENTROPY_BLOCK_SIZE
183 *
184 * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED
185 */
186int mbedtls_entropy_func(void *data, unsigned char *output, size_t len);
187
188/**
189 * \brief Add data to the accumulator manually
190 * (Thread-safe if MBEDTLS_THREADING_C is enabled)
191 *
192 * \param ctx Entropy context
193 * \param data Data to add
194 * \param len Length of data
195 *
196 * \return 0 if successful
197 */
198int mbedtls_entropy_update_manual(mbedtls_entropy_context *ctx,
199 const unsigned char *data, size_t len);
200
201#if defined(MBEDTLS_ENTROPY_NV_SEED)
202/**
203 * \brief Trigger an update of the seed file in NV by using the
204 * current entropy pool.
205 *
206 * \param ctx Entropy context
207 *
208 * \return 0 if successful
209 */
210int mbedtls_entropy_update_nv_seed(mbedtls_entropy_context *ctx);
211#endif /* MBEDTLS_ENTROPY_NV_SEED */
212
213#if defined(MBEDTLS_FS_IO)
214/**
215 * \brief Write a seed file
216 *
217 * \param ctx Entropy context
218 * \param path Name of the file
219 *
220 * \return 0 if successful,
221 * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, or
222 * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED
223 */
224int mbedtls_entropy_write_seed_file(mbedtls_entropy_context *ctx, const char *path);
225
226/**
227 * \brief Read and update a seed file. Seed is added to this
228 * instance. No more than MBEDTLS_ENTROPY_MAX_SEED_SIZE bytes are
229 * read from the seed file. The rest is ignored.
230 *
231 * \param ctx Entropy context
232 * \param path Name of the file
233 *
234 * \return 0 if successful,
235 * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error,
236 * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED
237 */
238int mbedtls_entropy_update_seed_file(mbedtls_entropy_context *ctx, const char *path);
239#endif /* MBEDTLS_FS_IO */
240
241#if defined(MBEDTLS_SELF_TEST)
242/**
243 * \brief Checkup routine
244 *
245 * This module self-test also calls the entropy self-test,
246 * mbedtls_entropy_source_self_test();
247 *
248 * \return 0 if successful, or 1 if a test failed
249 */
250int mbedtls_entropy_self_test(int verbose);
251
252#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)
253/**
254 * \brief Checkup routine
255 *
256 * Verifies the integrity of the hardware entropy source
257 * provided by the function 'mbedtls_hardware_poll()'.
258 *
259 * Note this is the only hardware entropy source that is known
260 * at link time, and other entropy sources configured
261 * dynamically at runtime by the function
262 * mbedtls_entropy_add_source() will not be tested.
263 *
264 * \return 0 if successful, or 1 if a test failed
265 */
266int mbedtls_entropy_source_self_test(int verbose);
267#endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */
268#endif /* MBEDTLS_SELF_TEST */
269
270#ifdef __cplusplus
271}
272#endif
273
274#endif /* entropy.h */