00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef MBEDTLS_HMAC_DRBG_H
00025 #define MBEDTLS_HMAC_DRBG_H
00026
00027 #include "md.h"
00028
00029 #if defined(MBEDTLS_THREADING_C)
00030 #include "mbedtls/threading.h"
00031 #endif
00032
00033
00034
00035
00036 #define MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG -0x0003
00037 #define MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG -0x0005
00038 #define MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR -0x0007
00039 #define MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED -0x0009
00049 #if !defined(MBEDTLS_HMAC_DRBG_RESEED_INTERVAL)
00050 #define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000
00051 #endif
00052
00053 #if !defined(MBEDTLS_HMAC_DRBG_MAX_INPUT)
00054 #define MBEDTLS_HMAC_DRBG_MAX_INPUT 256
00055 #endif
00056
00057 #if !defined(MBEDTLS_HMAC_DRBG_MAX_REQUEST)
00058 #define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024
00059 #endif
00060
00061 #if !defined(MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT)
00062 #define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384
00063 #endif
00064
00065
00066
00067 #define MBEDTLS_HMAC_DRBG_PR_OFF 0
00068 #define MBEDTLS_HMAC_DRBG_PR_ON 1
00070 #ifdef __cplusplus
00071 extern "C" {
00072 #endif
00073
00077 typedef struct
00078 {
00079
00080
00081 mbedtls_md_context_t md_ctx;
00082 unsigned char V[MBEDTLS_MD_MAX_SIZE];
00083 int reseed_counter;
00085
00086 size_t entropy_len;
00087 int prediction_resistance;
00089 int reseed_interval;
00091
00092 int (*f_entropy)(void *, unsigned char *, size_t);
00093 void *p_entropy;
00095 #if defined(MBEDTLS_THREADING_C)
00096 mbedtls_threading_mutex_t mutex;
00097 #endif
00098 } mbedtls_hmac_drbg_context;
00099
00108 void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx );
00109
00134 int mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx,
00135 const mbedtls_md_info_t * md_info,
00136 int (*f_entropy)(void *, unsigned char *, size_t),
00137 void *p_entropy,
00138 const unsigned char *custom,
00139 size_t len );
00140
00154 int mbedtls_hmac_drbg_seed_buf( mbedtls_hmac_drbg_context *ctx,
00155 const mbedtls_md_info_t * md_info,
00156 const unsigned char *data, size_t data_len );
00157
00167 void mbedtls_hmac_drbg_set_prediction_resistance( mbedtls_hmac_drbg_context *ctx,
00168 int resistance );
00169
00178 void mbedtls_hmac_drbg_set_entropy_len( mbedtls_hmac_drbg_context *ctx,
00179 size_t len );
00180
00188 void mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx,
00189 int interval );
00190
00201 void mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx,
00202 const unsigned char *additional, size_t add_len );
00203
00214 int mbedtls_hmac_drbg_reseed( mbedtls_hmac_drbg_context *ctx,
00215 const unsigned char *additional, size_t len );
00216
00233 int mbedtls_hmac_drbg_random_with_add( void *p_rng,
00234 unsigned char *output, size_t output_len,
00235 const unsigned char *additional,
00236 size_t add_len );
00237
00251 int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len );
00252
00258 void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx );
00259
00260 #if defined(MBEDTLS_FS_IO)
00261
00270 int mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path );
00271
00283 int mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path );
00284 #endif
00285
00286
00287 #if defined(MBEDTLS_SELF_TEST)
00288
00293 int mbedtls_hmac_drbg_self_test( int verbose );
00294 #endif
00295
00296 #ifdef __cplusplus
00297 }
00298 #endif
00299
00300 #endif