quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

psa_crypto_random_impl.h (4131B)


      1 /** \file psa_crypto_random_impl.h
      2  *
      3  * \brief PSA crypto random generator implementation abstraction.
      4  */
      5 /*
      6  *  Copyright The Mbed TLS Contributors
      7  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
      8  */
      9 
     10 #ifndef PSA_CRYPTO_RANDOM_IMPL_H
     11 #define PSA_CRYPTO_RANDOM_IMPL_H
     12 
     13 #include "psa_util_internal.h"
     14 
     15 #if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
     16 
     17 typedef mbedtls_psa_external_random_context_t mbedtls_psa_random_context_t;
     18 
     19 #else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
     20 
     21 #include "mbedtls/entropy.h"
     22 
     23 /* Choose a DRBG based on configuration and availability */
     24 #if defined(MBEDTLS_CTR_DRBG_C)
     25 
     26 #include "mbedtls/ctr_drbg.h"
     27 #undef MBEDTLS_PSA_HMAC_DRBG_MD_TYPE
     28 
     29 #elif defined(MBEDTLS_HMAC_DRBG_C)
     30 
     31 #include "mbedtls/hmac_drbg.h"
     32 #if defined(MBEDTLS_MD_CAN_SHA512) && defined(MBEDTLS_MD_CAN_SHA256)
     33 #include <limits.h>
     34 #if SIZE_MAX > 0xffffffff
     35 /* Looks like a 64-bit system, so prefer SHA-512. */
     36 #define MBEDTLS_PSA_HMAC_DRBG_MD_TYPE MBEDTLS_MD_SHA512
     37 #else
     38 /* Looks like a 32-bit system, so prefer SHA-256. */
     39 #define MBEDTLS_PSA_HMAC_DRBG_MD_TYPE MBEDTLS_MD_SHA256
     40 #endif
     41 #elif defined(MBEDTLS_MD_CAN_SHA512)
     42 #define MBEDTLS_PSA_HMAC_DRBG_MD_TYPE MBEDTLS_MD_SHA512
     43 #elif defined(MBEDTLS_MD_CAN_SHA256)
     44 #define MBEDTLS_PSA_HMAC_DRBG_MD_TYPE MBEDTLS_MD_SHA256
     45 #else
     46 #error "No hash algorithm available for HMAC_DBRG."
     47 #endif
     48 
     49 #else /* !MBEDTLS_CTR_DRBG_C && !MBEDTLS_HMAC_DRBG_C*/
     50 
     51 #error "No DRBG module available for the psa_crypto module."
     52 
     53 #endif /* !MBEDTLS_CTR_DRBG_C && !MBEDTLS_HMAC_DRBG_C*/
     54 
     55 /* The maximum number of bytes that mbedtls_psa_get_random() is expected to return. */
     56 #if defined(MBEDTLS_CTR_DRBG_C)
     57 #define MBEDTLS_PSA_RANDOM_MAX_REQUEST MBEDTLS_CTR_DRBG_MAX_REQUEST
     58 #elif defined(MBEDTLS_HMAC_DRBG_C)
     59 #define MBEDTLS_PSA_RANDOM_MAX_REQUEST MBEDTLS_HMAC_DRBG_MAX_REQUEST
     60 #endif
     61 
     62 #if defined(MBEDTLS_CTR_DRBG_C)
     63 typedef mbedtls_ctr_drbg_context            mbedtls_psa_drbg_context_t;
     64 #elif defined(MBEDTLS_HMAC_DRBG_C)
     65 typedef mbedtls_hmac_drbg_context           mbedtls_psa_drbg_context_t;
     66 #endif /* !MBEDTLS_CTR_DRBG_C && !MBEDTLS_HMAC_DRBG_C */
     67 
     68 typedef struct {
     69     void (* entropy_init)(mbedtls_entropy_context *ctx);
     70     void (* entropy_free)(mbedtls_entropy_context *ctx);
     71     mbedtls_entropy_context entropy;
     72     mbedtls_psa_drbg_context_t drbg;
     73 } mbedtls_psa_random_context_t;
     74 
     75 /** Initialize the PSA DRBG.
     76  *
     77  * \param p_rng        Pointer to the Mbed TLS DRBG state.
     78  */
     79 static inline void mbedtls_psa_drbg_init(mbedtls_psa_drbg_context_t *p_rng)
     80 {
     81 #if defined(MBEDTLS_CTR_DRBG_C)
     82     mbedtls_ctr_drbg_init(p_rng);
     83 #elif defined(MBEDTLS_HMAC_DRBG_C)
     84     mbedtls_hmac_drbg_init(p_rng);
     85 #endif
     86 }
     87 
     88 /** Deinitialize the PSA DRBG.
     89  *
     90  * \param p_rng        Pointer to the Mbed TLS DRBG state.
     91  */
     92 static inline void mbedtls_psa_drbg_free(mbedtls_psa_drbg_context_t *p_rng)
     93 {
     94 #if defined(MBEDTLS_CTR_DRBG_C)
     95     mbedtls_ctr_drbg_free(p_rng);
     96 #elif defined(MBEDTLS_HMAC_DRBG_C)
     97     mbedtls_hmac_drbg_free(p_rng);
     98 #endif
     99 }
    100 
    101 /** Seed the PSA DRBG.
    102  *
    103  * \param entropy       An entropy context to read the seed from.
    104  * \param custom        The personalization string.
    105  *                      This can be \c NULL, in which case the personalization
    106  *                      string is empty regardless of the value of \p len.
    107  * \param len           The length of the personalization string.
    108  *
    109  * \return              \c 0 on success.
    110  * \return              An Mbed TLS error code (\c MBEDTLS_ERR_xxx) on failure.
    111  */
    112 static inline int mbedtls_psa_drbg_seed(mbedtls_psa_drbg_context_t *drbg_ctx,
    113                                         mbedtls_entropy_context *entropy,
    114                                         const unsigned char *custom, size_t len)
    115 {
    116 #if defined(MBEDTLS_CTR_DRBG_C)
    117     return mbedtls_ctr_drbg_seed(drbg_ctx, mbedtls_entropy_func, entropy, custom, len);
    118 #elif defined(MBEDTLS_HMAC_DRBG_C)
    119     const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(MBEDTLS_PSA_HMAC_DRBG_MD_TYPE);
    120     return mbedtls_hmac_drbg_seed(drbg_ctx, md_info, mbedtls_entropy_func, entropy, custom, len);
    121 #endif
    122 }
    123 
    124 #endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
    125 
    126 #endif /* PSA_CRYPTO_RANDOM_IMPL_H */