@@ -47,44 +47,6 @@ static void init_heap(void)
47
47
#define init_heap (...)
48
48
#endif /* CONFIG_MBEDTLS_ENABLE_HEAP && MBEDTLS_MEMORY_BUFFER_ALLOC_C */
49
49
50
- #if defined(CONFIG_MBEDTLS_ENTROPY_POLL_ZEPHYR )
51
- static const struct device * const entropy_dev =
52
- DEVICE_DT_GET_OR_NULL (DT_CHOSEN (zephyr_entropy ));
53
-
54
- int mbedtls_hardware_poll (void * data , unsigned char * output , size_t len ,
55
- size_t * olen )
56
- {
57
- int ret ;
58
- uint16_t request_len = len > UINT16_MAX ? UINT16_MAX : len ;
59
-
60
- ARG_UNUSED (data );
61
-
62
- if (output == NULL || olen == NULL || len == 0 ) {
63
- return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ;
64
- }
65
-
66
- if (!IS_ENABLED (CONFIG_ENTROPY_HAS_DRIVER )) {
67
- sys_rand_get (output , len );
68
- * olen = len ;
69
-
70
- return 0 ;
71
- }
72
-
73
- if (!device_is_ready (entropy_dev )) {
74
- return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ;
75
- }
76
-
77
- ret = entropy_get_entropy (entropy_dev , (uint8_t * )output , request_len );
78
- if (ret < 0 ) {
79
- return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ;
80
- }
81
-
82
- * olen = request_len ;
83
-
84
- return 0 ;
85
- }
86
- #endif /* CONFIG_MBEDTLS_ENTROPY_POLL_ZEPHYR */
87
-
88
50
static int _mbedtls_init (void )
89
51
{
90
52
@@ -122,25 +84,67 @@ mbedtls_ms_time_t mbedtls_ms_time(void)
122
84
return (mbedtls_ms_time_t )k_uptime_get ();
123
85
}
124
86
87
+ #if defined(CONFIG_MBEDTLS_ENTROPY_POLL_ZEPHYR ) || defined(CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG )
88
+ static int get_random_data (uint8_t * output , size_t output_size , bool allow_non_cs )
89
+ {
90
+ int ret = MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED ;
91
+
92
+ #if defined(CONFIG_CSPRNG_ENABLED )
93
+ ret = sys_csrand_get (output , output_size );
94
+ if (ret == 0 ) {
95
+ return 0 ;
96
+ }
97
+ #endif /* CONFIG_CSPRNG_ENABLED */
98
+
99
+ if (allow_non_cs ) {
100
+ sys_rand_get (output , output_size );
101
+ ret = 0 ;
102
+ }
103
+
104
+ return ret ;
105
+ }
106
+ #endif /* CONFIG_MBEDTLS_ENTROPY_POLL_ZEPHYR || CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
107
+
108
+ #if defined(CONFIG_MBEDTLS_ENTROPY_POLL_ZEPHYR )
109
+ int mbedtls_hardware_poll (void * data , unsigned char * output , size_t len ,
110
+ size_t * olen )
111
+ {
112
+ int ret ;
113
+ uint16_t request_len = len > UINT16_MAX ? UINT16_MAX : len ;
114
+
115
+ ARG_UNUSED (data );
116
+
117
+ if (output == NULL || olen == NULL || len == 0 ) {
118
+ return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ;
119
+ }
120
+
121
+ ret = get_random_data (output , len , true);
122
+ if (ret < 0 ) {
123
+ return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ;
124
+ }
125
+
126
+ * olen = request_len ;
127
+
128
+ return 0 ;
129
+ }
130
+ #endif /* CONFIG_MBEDTLS_ENTROPY_POLL_ZEPHYR */
131
+
125
132
#if defined(CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG )
126
- /* MBEDTLS_PSA_CRYPTO_C requires a random generator to work and this can
127
- * be achieved through either legacy MbedTLS modules
128
- * (ENTROPY + CTR_DRBG/HMAC_DRBG) or provided externally by enabling the
129
- * CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG. In the latter case the following
130
- * callback functions needs to be defined.
131
- */
132
133
psa_status_t mbedtls_psa_external_get_random (
133
134
mbedtls_psa_external_random_context_t * context ,
134
135
uint8_t * output , size_t output_size , size_t * output_length )
135
136
{
136
137
(void ) context ;
138
+ int ret ;
137
139
138
- if (sys_csrand_get (output , output_size ) != 0 ) {
140
+ ret = get_random_data (output , output_size ,
141
+ IS_ENABLED (CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG_ALLOW_NON_CSPRNG ));
142
+ if (ret != 0 ) {
139
143
return PSA_ERROR_GENERIC_ERROR ;
140
144
}
141
145
142
146
* output_length = output_size ;
143
147
144
148
return PSA_SUCCESS ;
145
149
}
146
- #endif
150
+ #endif /* CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
0 commit comments