Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /**
  2.  * \file ctr_drbg.h
  3.  *
  4.  * \brief    This file contains definitions and functions for the
  5.  *           CTR_DRBG pseudorandom generator.
  6.  *
  7.  * CTR_DRBG is a standardized way of building a PRNG from a block-cipher
  8.  * in counter mode operation, as defined in <em>NIST SP 800-90A:
  9.  * Recommendation for Random Number Generation Using Deterministic Random
  10.  * Bit Generators</em>.
  11.  *
  12.  * The Mbed TLS implementation of CTR_DRBG uses AES-256 (default) or AES-128
  13.  * (if \c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is enabled at compile time)
  14.  * as the underlying block cipher, with a derivation function.
  15.  * The initial seeding grabs #MBEDTLS_CTR_DRBG_ENTROPY_LEN bytes of entropy.
  16.  * See the documentation of mbedtls_ctr_drbg_seed() for more details.
  17.  *
  18.  * Based on NIST SP 800-90A ยง10.2.1 table 3 and NIST SP 800-57 part 1 table 2,
  19.  * here are the security strengths achieved in typical configuration:
  20.  * - 256 bits under the default configuration of the library, with AES-256
  21.  *   and with #MBEDTLS_CTR_DRBG_ENTROPY_LEN set to 48 or more.
  22.  * - 256 bits if AES-256 is used, #MBEDTLS_CTR_DRBG_ENTROPY_LEN is set
  23.  *   to 32 or more, and the DRBG is initialized with an explicit
  24.  *   nonce in the \c custom parameter to mbedtls_ctr_drbg_seed().
  25.  * - 128 bits if AES-256 is used but #MBEDTLS_CTR_DRBG_ENTROPY_LEN is
  26.  *   between 24 and 47 and the DRBG is not initialized with an explicit
  27.  *   nonce (see mbedtls_ctr_drbg_seed()).
  28.  * - 128 bits if AES-128 is used (\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY enabled)
  29.  *   and #MBEDTLS_CTR_DRBG_ENTROPY_LEN is set to 24 or more (which is
  30.  *   always the case unless it is explicitly set to a different value
  31.  *   in config.h).
  32.  *
  33.  * Note that the value of #MBEDTLS_CTR_DRBG_ENTROPY_LEN defaults to:
  34.  * - \c 48 if the module \c MBEDTLS_SHA512_C is enabled and the symbol
  35.  *   \c MBEDTLS_ENTROPY_FORCE_SHA256 is disabled at compile time.
  36.  *   This is the default configuration of the library.
  37.  * - \c 32 if the module \c MBEDTLS_SHA512_C is disabled at compile time.
  38.  * - \c 32 if \c MBEDTLS_ENTROPY_FORCE_SHA256 is enabled at compile time.
  39.  */
  40. /*
  41.  *  Copyright (C) 2006-2019, Arm Limited (or its affiliates), All Rights Reserved
  42.  *  SPDX-License-Identifier: GPL-2.0
  43.  *
  44.  *  This program is free software; you can redistribute it and/or modify
  45.  *  it under the terms of the GNU General Public License as published by
  46.  *  the Free Software Foundation; either version 2 of the License, or
  47.  *  (at your option) any later version.
  48.  *
  49.  *  This program is distributed in the hope that it will be useful,
  50.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  51.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  52.  *  GNU General Public License for more details.
  53.  *
  54.  *  You should have received a copy of the GNU General Public License along
  55.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  56.  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  57.  *
  58.  *  This file is part of Mbed TLS (https://tls.mbed.org)
  59.  */
  60.  
  61. #ifndef MBEDTLS_CTR_DRBG_H
  62. #define MBEDTLS_CTR_DRBG_H
  63.  
  64. #if !defined(MBEDTLS_CONFIG_FILE)
  65. #include "config.h"
  66. #else
  67. #include MBEDTLS_CONFIG_FILE
  68. #endif
  69.  
  70. #include "aes.h"
  71.  
  72. #if defined(MBEDTLS_THREADING_C)
  73. #include "threading.h"
  74. #endif
  75.  
  76. #define MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED        -0x0034  /**< The entropy source failed. */
  77. #define MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG              -0x0036  /**< The requested random buffer length is too big. */
  78. #define MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG                -0x0038  /**< The input (entropy + additional data) is too large. */
  79. #define MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR                -0x003A  /**< Read or write error in file. */
  80.  
  81. #define MBEDTLS_CTR_DRBG_BLOCKSIZE          16 /**< The block size used by the cipher. */
  82.  
  83. #if defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY)
  84. #define MBEDTLS_CTR_DRBG_KEYSIZE            16
  85. /**< The key size in bytes used by the cipher.
  86.  *
  87.  * Compile-time choice: 16 bytes (128 bits)
  88.  * because #MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is enabled.
  89.  */
  90. #else
  91. #define MBEDTLS_CTR_DRBG_KEYSIZE            32
  92. /**< The key size in bytes used by the cipher.
  93.  *
  94.  * Compile-time choice: 32 bytes (256 bits)
  95.  * because \c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is disabled.
  96.  */
  97. #endif
  98.  
  99. #define MBEDTLS_CTR_DRBG_KEYBITS            ( MBEDTLS_CTR_DRBG_KEYSIZE * 8 ) /**< The key size for the DRBG operation, in bits. */
  100. #define MBEDTLS_CTR_DRBG_SEEDLEN            ( MBEDTLS_CTR_DRBG_KEYSIZE + MBEDTLS_CTR_DRBG_BLOCKSIZE ) /**< The seed length, calculated as (counter + AES key). */
  101.  
  102. /**
  103.  * \name SECTION: Module settings
  104.  *
  105.  * The configuration options you can set for this module are in this section.
  106.  * Either change them in config.h or define them using the compiler command
  107.  * line.
  108.  * \{
  109.  */
  110.  
  111. /** \def MBEDTLS_CTR_DRBG_ENTROPY_LEN
  112.  *
  113.  * \brief The amount of entropy used per seed by default, in bytes.
  114.  */
  115. #if !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN)
  116. #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256)
  117. /** This is 48 bytes because the entropy module uses SHA-512
  118.  * (\c MBEDTLS_ENTROPY_FORCE_SHA256 is disabled).
  119.  */
  120. #define MBEDTLS_CTR_DRBG_ENTROPY_LEN        48
  121.  
  122. #else /* defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) */
  123.  
  124. /** This is 32 bytes because the entropy module uses SHA-256
  125.  * (the SHA512 module is disabled or
  126.  * \c MBEDTLS_ENTROPY_FORCE_SHA256 is enabled).
  127.  */
  128. #if !defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY)
  129. /** \warning To achieve a 256-bit security strength, you must pass a nonce
  130.  *           to mbedtls_ctr_drbg_seed().
  131.  */
  132. #endif /* !defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) */
  133. #define MBEDTLS_CTR_DRBG_ENTROPY_LEN        32
  134. #endif /* defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) */
  135. #endif /* !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) */
  136.  
  137. #if !defined(MBEDTLS_CTR_DRBG_RESEED_INTERVAL)
  138. #define MBEDTLS_CTR_DRBG_RESEED_INTERVAL    10000
  139. /**< The interval before reseed is performed by default. */
  140. #endif
  141.  
  142. #if !defined(MBEDTLS_CTR_DRBG_MAX_INPUT)
  143. #define MBEDTLS_CTR_DRBG_MAX_INPUT          256
  144. /**< The maximum number of additional input Bytes. */
  145. #endif
  146.  
  147. #if !defined(MBEDTLS_CTR_DRBG_MAX_REQUEST)
  148. #define MBEDTLS_CTR_DRBG_MAX_REQUEST        1024
  149. /**< The maximum number of requested Bytes per call. */
  150. #endif
  151.  
  152. #if !defined(MBEDTLS_CTR_DRBG_MAX_SEED_INPUT)
  153. #define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT     384
  154. /**< The maximum size of seed or reseed buffer in bytes. */
  155. #endif
  156.  
  157. /* \} name SECTION: Module settings */
  158.  
  159. #define MBEDTLS_CTR_DRBG_PR_OFF             0
  160. /**< Prediction resistance is disabled. */
  161. #define MBEDTLS_CTR_DRBG_PR_ON              1
  162. /**< Prediction resistance is enabled. */
  163.  
  164. #ifdef __cplusplus
  165. extern "C" {
  166. #endif
  167.  
  168. /**
  169.  * \brief          The CTR_DRBG context structure.
  170.  */
  171. typedef struct mbedtls_ctr_drbg_context
  172. {
  173.     unsigned char counter[16];  /*!< The counter (V). */
  174.     int reseed_counter;         /*!< The reseed counter. */
  175.     int prediction_resistance;  /*!< This determines whether prediction
  176.                                      resistance is enabled, that is
  177.                                      whether to systematically reseed before
  178.                                      each random generation. */
  179.     size_t entropy_len;         /*!< The amount of entropy grabbed on each
  180.                                      seed or reseed operation. */
  181.     int reseed_interval;        /*!< The reseed interval. */
  182.  
  183.     mbedtls_aes_context aes_ctx;        /*!< The AES context. */
  184.  
  185.     /*
  186.      * Callbacks (Entropy)
  187.      */
  188.     int (*f_entropy)(void *, unsigned char *, size_t);
  189.                                 /*!< The entropy callback function. */
  190.  
  191.     void *p_entropy;            /*!< The context for the entropy function. */
  192.  
  193. #if defined(MBEDTLS_THREADING_C)
  194.     mbedtls_threading_mutex_t mutex;
  195. #endif
  196. }
  197. mbedtls_ctr_drbg_context;
  198.  
  199. /**
  200.  * \brief               This function initializes the CTR_DRBG context,
  201.  *                      and prepares it for mbedtls_ctr_drbg_seed()
  202.  *                      or mbedtls_ctr_drbg_free().
  203.  *
  204.  * \param ctx           The CTR_DRBG context to initialize.
  205.  */
  206. void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx );
  207.  
  208. /**
  209.  * \brief               This function seeds and sets up the CTR_DRBG
  210.  *                      entropy source for future reseeds.
  211.  *
  212.  * A typical choice for the \p f_entropy and \p p_entropy parameters is
  213.  * to use the entropy module:
  214.  * - \p f_entropy is mbedtls_entropy_func();
  215.  * - \p p_entropy is an instance of ::mbedtls_entropy_context initialized
  216.  *   with mbedtls_entropy_init() (which registers the platform's default
  217.  *   entropy sources).
  218.  *
  219.  * The entropy length is #MBEDTLS_CTR_DRBG_ENTROPY_LEN by default.
  220.  * You can override it by calling mbedtls_ctr_drbg_set_entropy_len().
  221.  *
  222.  * You can provide a personalization string in addition to the
  223.  * entropy source, to make this instantiation as unique as possible.
  224.  *
  225.  * \note                The _seed_material_ value passed to the derivation
  226.  *                      function in the CTR_DRBG Instantiate Process
  227.  *                      described in NIST SP 800-90A ยง10.2.1.3.2
  228.  *                      is the concatenation of the string obtained from
  229.  *                      calling \p f_entropy and the \p custom string.
  230.  *                      The origin of the nonce depends on the value of
  231.  *                      the entropy length relative to the security strength.
  232.  *                      - If the entropy length is at least 1.5 times the
  233.  *                        security strength then the nonce is taken from the
  234.  *                        string obtained with \p f_entropy.
  235.  *                      - If the entropy length is less than the security
  236.  *                        strength, then the nonce is taken from \p custom.
  237.  *                        In this case, for compliance with SP 800-90A,
  238.  *                        you must pass a unique value of \p custom at
  239.  *                        each invocation. See SP 800-90A ยง8.6.7 for more
  240.  *                        details.
  241.  */
  242. #if MBEDTLS_CTR_DRBG_ENTROPY_LEN < MBEDTLS_CTR_DRBG_KEYSIZE * 3 / 2
  243. /** \warning            When #MBEDTLS_CTR_DRBG_ENTROPY_LEN is less than
  244.  *                      #MBEDTLS_CTR_DRBG_KEYSIZE * 3 / 2, to achieve the
  245.  *                      maximum security strength permitted by CTR_DRBG,
  246.  *                      you must pass a value of \p custom that is a nonce:
  247.  *                      this value must never be repeated in subsequent
  248.  *                      runs of the same application or on a different
  249.  *                      device.
  250.  */
  251. #endif
  252. /**
  253.  * \param ctx           The CTR_DRBG context to seed.
  254.  *                      It must have been initialized with
  255.  *                      mbedtls_ctr_drbg_init().
  256.  *                      After a successful call to mbedtls_ctr_drbg_seed(),
  257.  *                      you may not call mbedtls_ctr_drbg_seed() again on
  258.  *                      the same context unless you call
  259.  *                      mbedtls_ctr_drbg_free() and mbedtls_ctr_drbg_init()
  260.  *                      again first.
  261.  * \param f_entropy     The entropy callback, taking as arguments the
  262.  *                      \p p_entropy context, the buffer to fill, and the
  263.  *                      length of the buffer.
  264.  *                      \p f_entropy is always called with a buffer size
  265.  *                      equal to the entropy length.
  266.  * \param p_entropy     The entropy context to pass to \p f_entropy.
  267.  * \param custom        The personalization string.
  268.  *                      This can be \c NULL, in which case the personalization
  269.  *                      string is empty regardless of the value of \p len.
  270.  * \param len           The length of the personalization string.
  271.  *                      This must be at most
  272.  *                      #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT
  273.  *                      - #MBEDTLS_CTR_DRBG_ENTROPY_LEN.
  274.  *
  275.  * \return              \c 0 on success.
  276.  * \return              #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure.
  277.  */
  278. int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,
  279.                    int (*f_entropy)(void *, unsigned char *, size_t),
  280.                    void *p_entropy,
  281.                    const unsigned char *custom,
  282.                    size_t len );
  283.  
  284. /**
  285.  * \brief               This function clears CTR_CRBG context data.
  286.  *
  287.  * \param ctx           The CTR_DRBG context to clear.
  288.  */
  289. void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx );
  290.  
  291. /**
  292.  * \brief               This function turns prediction resistance on or off.
  293.  *                      The default value is off.
  294.  *
  295.  * \note                If enabled, entropy is gathered at the beginning of
  296.  *                      every call to mbedtls_ctr_drbg_random_with_add()
  297.  *                      or mbedtls_ctr_drbg_random().
  298.  *                      Only use this if your entropy source has sufficient
  299.  *                      throughput.
  300.  *
  301.  * \param ctx           The CTR_DRBG context.
  302.  * \param resistance    #MBEDTLS_CTR_DRBG_PR_ON or #MBEDTLS_CTR_DRBG_PR_OFF.
  303.  */
  304. void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx,
  305.                                          int resistance );
  306.  
  307. /**
  308.  * \brief               This function sets the amount of entropy grabbed on each
  309.  *                      seed or reseed.
  310.  *
  311.  * The default value is #MBEDTLS_CTR_DRBG_ENTROPY_LEN.
  312.  *
  313.  * \note                The security strength of CTR_DRBG is bounded by the
  314.  *                      entropy length. Thus:
  315.  *                      - When using AES-256
  316.  *                        (\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is disabled,
  317.  *                        which is the default),
  318.  *                        \p len must be at least 32 (in bytes)
  319.  *                        to achieve a 256-bit strength.
  320.  *                      - When using AES-128
  321.  *                        (\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is enabled)
  322.  *                        \p len must be at least 16 (in bytes)
  323.  *                        to achieve a 128-bit strength.
  324.  *
  325.  * \param ctx           The CTR_DRBG context.
  326.  * \param len           The amount of entropy to grab, in bytes.
  327.  *                      This must be at most #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT.
  328.  */
  329. void mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx,
  330.                                size_t len );
  331.  
  332. /**
  333.  * \brief               This function sets the reseed interval.
  334.  *
  335.  * The reseed interval is the number of calls to mbedtls_ctr_drbg_random()
  336.  * or mbedtls_ctr_drbg_random_with_add() after which the entropy function
  337.  * is called again.
  338.  *
  339.  * The default value is #MBEDTLS_CTR_DRBG_RESEED_INTERVAL.
  340.  *
  341.  * \param ctx           The CTR_DRBG context.
  342.  * \param interval      The reseed interval.
  343.  */
  344. void mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx,
  345.                                    int interval );
  346.  
  347. /**
  348.  * \brief               This function reseeds the CTR_DRBG context, that is
  349.  *                      extracts data from the entropy source.
  350.  *
  351.  * \param ctx           The CTR_DRBG context.
  352.  * \param additional    Additional data to add to the state. Can be \c NULL.
  353.  * \param len           The length of the additional data.
  354.  *                      This must be less than
  355.  *                      #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - \c entropy_len
  356.  *                      where \c entropy_len is the entropy length
  357.  *                      configured for the context.
  358.  *
  359.  * \return              \c 0 on success.
  360.  * \return              #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure.
  361.  */
  362. int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx,
  363.                      const unsigned char *additional, size_t len );
  364.  
  365. /**
  366.  * \brief              This function updates the state of the CTR_DRBG context.
  367.  *
  368.  * \param ctx          The CTR_DRBG context.
  369.  * \param additional   The data to update the state with. This must not be
  370.  *                     \c NULL unless \p add_len is \c 0.
  371.  * \param add_len      Length of \p additional in bytes. This must be at
  372.  *                     most #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT.
  373.  *
  374.  * \return             \c 0 on success.
  375.  * \return             #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG if
  376.  *                     \p add_len is more than
  377.  *                     #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT.
  378.  * \return             An error from the underlying AES cipher on failure.
  379.  */
  380. int mbedtls_ctr_drbg_update_ret( mbedtls_ctr_drbg_context *ctx,
  381.                                  const unsigned char *additional,
  382.                                  size_t add_len );
  383.  
  384. /**
  385.  * \brief   This function updates a CTR_DRBG instance with additional
  386.  *          data and uses it to generate random data.
  387.  *
  388.  * This function automatically reseeds if the reseed counter is exceeded
  389.  * or prediction resistance is enabled.
  390.  *
  391.  * \param p_rng         The CTR_DRBG context. This must be a pointer to a
  392.  *                      #mbedtls_ctr_drbg_context structure.
  393.  * \param output        The buffer to fill.
  394.  * \param output_len    The length of the buffer in bytes.
  395.  * \param additional    Additional data to update. Can be \c NULL, in which
  396.  *                      case the additional data is empty regardless of
  397.  *                      the value of \p add_len.
  398.  * \param add_len       The length of the additional data
  399.  *                      if \p additional is not \c NULL.
  400.  *                      This must be less than #MBEDTLS_CTR_DRBG_MAX_INPUT
  401.  *                      and less than
  402.  *                      #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - \c entropy_len
  403.  *                      where \c entropy_len is the entropy length
  404.  *                      configured for the context.
  405.  *
  406.  * \return    \c 0 on success.
  407.  * \return    #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or
  408.  *            #MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG on failure.
  409.  */
  410. int mbedtls_ctr_drbg_random_with_add( void *p_rng,
  411.                               unsigned char *output, size_t output_len,
  412.                               const unsigned char *additional, size_t add_len );
  413.  
  414. /**
  415.  * \brief   This function uses CTR_DRBG to generate random data.
  416.  *
  417.  * This function automatically reseeds if the reseed counter is exceeded
  418.  * or prediction resistance is enabled.
  419.  *
  420.  *
  421.  * \param p_rng         The CTR_DRBG context. This must be a pointer to a
  422.  *                      #mbedtls_ctr_drbg_context structure.
  423.  * \param output        The buffer to fill.
  424.  * \param output_len    The length of the buffer in bytes.
  425.  *
  426.  * \return              \c 0 on success.
  427.  * \return              #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or
  428.  *                      #MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG on failure.
  429.  */
  430. int mbedtls_ctr_drbg_random( void *p_rng,
  431.                      unsigned char *output, size_t output_len );
  432.  
  433.  
  434. #if ! defined(MBEDTLS_DEPRECATED_REMOVED)
  435. #if defined(MBEDTLS_DEPRECATED_WARNING)
  436. #define MBEDTLS_DEPRECATED    __attribute__((deprecated))
  437. #else
  438. #define MBEDTLS_DEPRECATED
  439. #endif
  440. /**
  441.  * \brief              This function updates the state of the CTR_DRBG context.
  442.  *
  443.  * \deprecated         Superseded by mbedtls_ctr_drbg_update_ret()
  444.  *                     in 2.16.0.
  445.  *
  446.  * \note               If \p add_len is greater than
  447.  *                     #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT, only the first
  448.  *                     #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT Bytes are used.
  449.  *                     The remaining Bytes are silently discarded.
  450.  *
  451.  * \param ctx          The CTR_DRBG context.
  452.  * \param additional   The data to update the state with.
  453.  * \param add_len      Length of \p additional data.
  454.  */
  455. MBEDTLS_DEPRECATED void mbedtls_ctr_drbg_update(
  456.     mbedtls_ctr_drbg_context *ctx,
  457.     const unsigned char *additional,
  458.     size_t add_len );
  459. #undef MBEDTLS_DEPRECATED
  460. #endif /* !MBEDTLS_DEPRECATED_REMOVED */
  461.  
  462. #if defined(MBEDTLS_FS_IO)
  463. /**
  464.  * \brief               This function writes a seed file.
  465.  *
  466.  * \param ctx           The CTR_DRBG context.
  467.  * \param path          The name of the file.
  468.  *
  469.  * \return              \c 0 on success.
  470.  * \return              #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error.
  471.  * \return              #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on reseed
  472.  *                      failure.
  473.  */
  474. int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path );
  475.  
  476. /**
  477.  * \brief               This function reads and updates a seed file. The seed
  478.  *                      is added to this instance.
  479.  *
  480.  * \param ctx           The CTR_DRBG context.
  481.  * \param path          The name of the file.
  482.  *
  483.  * \return              \c 0 on success.
  484.  * \return              #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error.
  485.  * \return              #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on
  486.  *                      reseed failure.
  487.  * \return              #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG if the existing
  488.  *                      seed file is too large.
  489.  */
  490. int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path );
  491. #endif /* MBEDTLS_FS_IO */
  492.  
  493. #if defined(MBEDTLS_SELF_TEST)
  494.  
  495. /**
  496.  * \brief               The CTR_DRBG checkup routine.
  497.  *
  498.  * \return              \c 0 on success.
  499.  * \return              \c 1 on failure.
  500.  */
  501. int mbedtls_ctr_drbg_self_test( int verbose );
  502.  
  503. #endif /* MBEDTLS_SELF_TEST */
  504.  
  505. /* Internal functions (do not call directly) */
  506. int mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *,
  507.                                int (*)(void *, unsigned char *, size_t), void *,
  508.                                const unsigned char *, size_t, size_t );
  509.  
  510. #ifdef __cplusplus
  511. }
  512. #endif
  513.  
  514. #endif /* ctr_drbg.h */
  515.