Branch data Line data Source code
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 : 1 : 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 : 1 : mbedtls_hmac_drbg_init(p_rng);
85 : : #endif
86 : 1 : }
87 : :
88 : : /** Deinitialize the PSA DRBG.
89 : : *
90 : : * \param p_rng Pointer to the Mbed TLS DRBG state.
91 : : */
92 : 0 : 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 : 0 : mbedtls_hmac_drbg_free(p_rng);
98 : : #endif
99 : 0 : }
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 : 1 : 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 : 1 : const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(MBEDTLS_PSA_HMAC_DRBG_MD_TYPE);
120 : 1 : 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 */
|