Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbedtls by
entropy.h
00001 /** 00002 * \file entropy.h 00003 * 00004 * \brief Entropy accumulator implementation 00005 * 00006 * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved 00007 * SPDX-License-Identifier: Apache-2.0 00008 * 00009 * Licensed under the Apache License, Version 2.0 (the "License"); you may 00010 * not use this file except in compliance with the License. 00011 * You may obtain a copy of the License at 00012 * 00013 * http://www.apache.org/licenses/LICENSE-2.0 00014 * 00015 * Unless required by applicable law or agreed to in writing, software 00016 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 00017 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00018 * See the License for the specific language governing permissions and 00019 * limitations under the License. 00020 * 00021 * This file is part of mbed TLS (https://tls.mbed.org) 00022 */ 00023 #ifndef MBEDTLS_ENTROPY_H 00024 #define MBEDTLS_ENTROPY_H 00025 00026 #if !defined(MBEDTLS_CONFIG_FILE) 00027 #include "config.h" 00028 #else 00029 #include MBEDTLS_CONFIG_FILE 00030 #endif 00031 00032 #include <stddef.h> 00033 00034 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) 00035 #include "sha512.h" 00036 #define MBEDTLS_ENTROPY_SHA512_ACCUMULATOR 00037 #else 00038 #if defined(MBEDTLS_SHA256_C) 00039 #define MBEDTLS_ENTROPY_SHA256_ACCUMULATOR 00040 #include "sha256.h" 00041 #endif 00042 #endif 00043 00044 #if defined(MBEDTLS_THREADING_C) 00045 #include "threading.h" 00046 #endif 00047 00048 #if defined(MBEDTLS_HAVEGE_C) 00049 #include "havege.h" 00050 #endif 00051 00052 #define MBEDTLS_ERR_ENTROPY_SOURCE_FAILED -0x003C /**< Critical entropy source failure. */ 00053 #define MBEDTLS_ERR_ENTROPY_MAX_SOURCES -0x003E /**< No more sources can be added. */ 00054 #define MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED -0x0040 /**< No sources have been added to poll. */ 00055 #define MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE -0x003D /**< No strong sources have been added to poll. */ 00056 #define MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR -0x003F /**< Read/write error in file. */ 00057 00058 /** 00059 * \name SECTION: Module settings 00060 * 00061 * The configuration options you can set for this module are in this section. 00062 * Either change them in config.h or define them on the compiler command line. 00063 * \{ 00064 */ 00065 00066 #if !defined(MBEDTLS_ENTROPY_MAX_SOURCES) 00067 #define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ 00068 #endif 00069 00070 #if !defined(MBEDTLS_ENTROPY_MAX_GATHER) 00071 #define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ 00072 #endif 00073 00074 /* \} name SECTION: Module settings */ 00075 00076 #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) 00077 #define MBEDTLS_ENTROPY_BLOCK_SIZE 64 /**< Block size of entropy accumulator (SHA-512) */ 00078 #else 00079 #define MBEDTLS_ENTROPY_BLOCK_SIZE 32 /**< Block size of entropy accumulator (SHA-256) */ 00080 #endif 00081 00082 #define MBEDTLS_ENTROPY_MAX_SEED_SIZE 1024 /**< Maximum size of seed we read from seed file */ 00083 #define MBEDTLS_ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_MAX_SOURCES 00084 00085 #define MBEDTLS_ENTROPY_SOURCE_STRONG 1 /**< Entropy source is strong */ 00086 #define MBEDTLS_ENTROPY_SOURCE_WEAK 0 /**< Entropy source is weak */ 00087 00088 #ifdef __cplusplus 00089 extern "C" { 00090 #endif 00091 00092 /** 00093 * \brief Entropy poll callback pointer 00094 * 00095 * \param data Callback-specific data pointer 00096 * \param output Data to fill 00097 * \param len Maximum size to provide 00098 * \param olen The actual amount of bytes put into the buffer (Can be 0) 00099 * 00100 * \return 0 if no critical failures occurred, 00101 * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED otherwise 00102 */ 00103 typedef int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, size_t len, 00104 size_t *olen); 00105 00106 /** 00107 * \brief Entropy source state 00108 */ 00109 typedef struct 00110 { 00111 mbedtls_entropy_f_source_ptr f_source; /**< The entropy source callback */ 00112 void * p_source; /**< The callback data pointer */ 00113 size_t size; /**< Amount received in bytes */ 00114 size_t threshold; /**< Minimum bytes required before release */ 00115 int strong; /**< Is the source strong? */ 00116 } 00117 mbedtls_entropy_source_state; 00118 00119 /** 00120 * \brief Entropy context structure 00121 */ 00122 typedef struct 00123 { 00124 #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) 00125 mbedtls_sha512_context accumulator; 00126 #else 00127 mbedtls_sha256_context accumulator; 00128 #endif 00129 int source_count; 00130 mbedtls_entropy_source_state source[MBEDTLS_ENTROPY_MAX_SOURCES]; 00131 #if defined(MBEDTLS_HAVEGE_C) 00132 mbedtls_havege_state havege_data; 00133 #endif 00134 #if defined(MBEDTLS_THREADING_C) 00135 mbedtls_threading_mutex_t mutex ; /*!< mutex */ 00136 #endif 00137 #if defined(MBEDTLS_ENTROPY_NV_SEED) 00138 int initial_entropy_run; 00139 #endif 00140 } 00141 mbedtls_entropy_context; 00142 00143 /** 00144 * \brief Initialize the context 00145 * 00146 * \param ctx Entropy context to initialize 00147 */ 00148 void mbedtls_entropy_init( mbedtls_entropy_context *ctx ); 00149 00150 /** 00151 * \brief Free the data in the context 00152 * 00153 * \param ctx Entropy context to free 00154 */ 00155 void mbedtls_entropy_free( mbedtls_entropy_context *ctx ); 00156 00157 /** 00158 * \brief Adds an entropy source to poll 00159 * (Thread-safe if MBEDTLS_THREADING_C is enabled) 00160 * 00161 * \param ctx Entropy context 00162 * \param f_source Entropy function 00163 * \param p_source Function data 00164 * \param threshold Minimum required from source before entropy is released 00165 * ( with mbedtls_entropy_func() ) (in bytes) 00166 * \param strong MBEDTLS_ENTROPY_SOURCE_STRONG or 00167 * MBEDTSL_ENTROPY_SOURCE_WEAK. 00168 * At least one strong source needs to be added. 00169 * Weaker sources (such as the cycle counter) can be used as 00170 * a complement. 00171 * 00172 * \return 0 if successful or MBEDTLS_ERR_ENTROPY_MAX_SOURCES 00173 */ 00174 int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx, 00175 mbedtls_entropy_f_source_ptr f_source, void *p_source, 00176 size_t threshold, int strong ); 00177 00178 /** 00179 * \brief Trigger an extra gather poll for the accumulator 00180 * (Thread-safe if MBEDTLS_THREADING_C is enabled) 00181 * 00182 * \param ctx Entropy context 00183 * 00184 * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED 00185 */ 00186 int mbedtls_entropy_gather( mbedtls_entropy_context *ctx ); 00187 00188 /** 00189 * \brief Retrieve entropy from the accumulator 00190 * (Maximum length: MBEDTLS_ENTROPY_BLOCK_SIZE) 00191 * (Thread-safe if MBEDTLS_THREADING_C is enabled) 00192 * 00193 * \param data Entropy context 00194 * \param output Buffer to fill 00195 * \param len Number of bytes desired, must be at most MBEDTLS_ENTROPY_BLOCK_SIZE 00196 * 00197 * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED 00198 */ 00199 int mbedtls_entropy_func( void *data, unsigned char *output, size_t len ); 00200 00201 /** 00202 * \brief Add data to the accumulator manually 00203 * (Thread-safe if MBEDTLS_THREADING_C is enabled) 00204 * 00205 * \param ctx Entropy context 00206 * \param data Data to add 00207 * \param len Length of data 00208 * 00209 * \return 0 if successful 00210 */ 00211 int mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx, 00212 const unsigned char *data, size_t len ); 00213 00214 #if defined(MBEDTLS_ENTROPY_NV_SEED) 00215 /** 00216 * \brief Trigger an update of the seed file in NV by using the 00217 * current entropy pool. 00218 * 00219 * \param ctx Entropy context 00220 * 00221 * \return 0 if successful 00222 */ 00223 int mbedtls_entropy_update_nv_seed( mbedtls_entropy_context *ctx ); 00224 #endif /* MBEDTLS_ENTROPY_NV_SEED */ 00225 00226 #if defined(MBEDTLS_FS_IO) 00227 /** 00228 * \brief Write a seed file 00229 * 00230 * \param ctx Entropy context 00231 * \param path Name of the file 00232 * 00233 * \return 0 if successful, 00234 * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, or 00235 * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED 00236 */ 00237 int mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path ); 00238 00239 /** 00240 * \brief Read and update a seed file. Seed is added to this 00241 * instance. No more than MBEDTLS_ENTROPY_MAX_SEED_SIZE bytes are 00242 * read from the seed file. The rest is ignored. 00243 * 00244 * \param ctx Entropy context 00245 * \param path Name of the file 00246 * 00247 * \return 0 if successful, 00248 * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, 00249 * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED 00250 */ 00251 int mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path ); 00252 #endif /* MBEDTLS_FS_IO */ 00253 00254 #if defined(MBEDTLS_SELF_TEST) 00255 /** 00256 * \brief Checkup routine 00257 * 00258 * This module self-test also calls the entropy self-test, 00259 * mbedtls_entropy_source_self_test(); 00260 * 00261 * \return 0 if successful, or 1 if a test failed 00262 */ 00263 int mbedtls_entropy_self_test( int verbose ); 00264 00265 #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) 00266 /** 00267 * \brief Checkup routine 00268 * 00269 * Verifies the integrity of the hardware entropy source 00270 * provided by the function 'mbedtls_hardware_poll()'. 00271 * 00272 * Note this is the only hardware entropy source that is known 00273 * at link time, and other entropy sources configured 00274 * dynamically at runtime by the function 00275 * mbedtls_entropy_add_source() will not be tested. 00276 * 00277 * \return 0 if successful, or 1 if a test failed 00278 */ 00279 int mbedtls_entropy_source_self_test( int verbose ); 00280 #endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */ 00281 #endif /* MBEDTLS_SELF_TEST */ 00282 00283 #ifdef __cplusplus 00284 } 00285 #endif 00286 00287 #endif /* entropy.h */
Generated on Tue Jul 12 2022 17:25:41 by
