psa_crypto_random_impl.h 4.0 KB

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