xref: /aosp_15_r20/external/mbedtls/library/platform.c (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi  *  Platform abstraction layer
3*62c56f98SSadaf Ebrahimi  *
4*62c56f98SSadaf Ebrahimi  *  Copyright The Mbed TLS Contributors
5*62c56f98SSadaf Ebrahimi  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6*62c56f98SSadaf Ebrahimi  */
7*62c56f98SSadaf Ebrahimi 
8*62c56f98SSadaf Ebrahimi #include "common.h"
9*62c56f98SSadaf Ebrahimi 
10*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_C)
11*62c56f98SSadaf Ebrahimi 
12*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h"
13*62c56f98SSadaf Ebrahimi #include "mbedtls/platform_util.h"
14*62c56f98SSadaf Ebrahimi #include "mbedtls/error.h"
15*62c56f98SSadaf Ebrahimi 
16*62c56f98SSadaf Ebrahimi /* The compile time configuration of memory allocation via the macros
17*62c56f98SSadaf Ebrahimi  * MBEDTLS_PLATFORM_{FREE/CALLOC}_MACRO takes precedence over the runtime
18*62c56f98SSadaf Ebrahimi  * configuration via mbedtls_platform_set_calloc_free(). So, omit everything
19*62c56f98SSadaf Ebrahimi  * related to the latter if MBEDTLS_PLATFORM_{FREE/CALLOC}_MACRO are defined. */
20*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_MEMORY) &&                 \
21*62c56f98SSadaf Ebrahimi     !(defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&        \
22*62c56f98SSadaf Ebrahimi     defined(MBEDTLS_PLATFORM_FREE_MACRO))
23*62c56f98SSadaf Ebrahimi 
24*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_CALLOC)
platform_calloc_uninit(size_t n,size_t size)25*62c56f98SSadaf Ebrahimi static void *platform_calloc_uninit(size_t n, size_t size)
26*62c56f98SSadaf Ebrahimi {
27*62c56f98SSadaf Ebrahimi     ((void) n);
28*62c56f98SSadaf Ebrahimi     ((void) size);
29*62c56f98SSadaf Ebrahimi     return NULL;
30*62c56f98SSadaf Ebrahimi }
31*62c56f98SSadaf Ebrahimi 
32*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_CALLOC   platform_calloc_uninit
33*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_CALLOC */
34*62c56f98SSadaf Ebrahimi 
35*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_FREE)
platform_free_uninit(void * ptr)36*62c56f98SSadaf Ebrahimi static void platform_free_uninit(void *ptr)
37*62c56f98SSadaf Ebrahimi {
38*62c56f98SSadaf Ebrahimi     ((void) ptr);
39*62c56f98SSadaf Ebrahimi }
40*62c56f98SSadaf Ebrahimi 
41*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_FREE     platform_free_uninit
42*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_FREE */
43*62c56f98SSadaf Ebrahimi 
44*62c56f98SSadaf Ebrahimi static void * (*mbedtls_calloc_func)(size_t, size_t) = MBEDTLS_PLATFORM_STD_CALLOC;
45*62c56f98SSadaf Ebrahimi static void (*mbedtls_free_func)(void *) = MBEDTLS_PLATFORM_STD_FREE;
46*62c56f98SSadaf Ebrahimi 
mbedtls_calloc(size_t nmemb,size_t size)47*62c56f98SSadaf Ebrahimi void *mbedtls_calloc(size_t nmemb, size_t size)
48*62c56f98SSadaf Ebrahimi {
49*62c56f98SSadaf Ebrahimi     return (*mbedtls_calloc_func)(nmemb, size);
50*62c56f98SSadaf Ebrahimi }
51*62c56f98SSadaf Ebrahimi 
mbedtls_free(void * ptr)52*62c56f98SSadaf Ebrahimi void mbedtls_free(void *ptr)
53*62c56f98SSadaf Ebrahimi {
54*62c56f98SSadaf Ebrahimi     (*mbedtls_free_func)(ptr);
55*62c56f98SSadaf Ebrahimi }
56*62c56f98SSadaf Ebrahimi 
mbedtls_platform_set_calloc_free(void * (* calloc_func)(size_t,size_t),void (* free_func)(void *))57*62c56f98SSadaf Ebrahimi int mbedtls_platform_set_calloc_free(void *(*calloc_func)(size_t, size_t),
58*62c56f98SSadaf Ebrahimi                                      void (*free_func)(void *))
59*62c56f98SSadaf Ebrahimi {
60*62c56f98SSadaf Ebrahimi     mbedtls_calloc_func = calloc_func;
61*62c56f98SSadaf Ebrahimi     mbedtls_free_func = free_func;
62*62c56f98SSadaf Ebrahimi     return 0;
63*62c56f98SSadaf Ebrahimi }
64*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_MEMORY &&
65*62c56f98SSadaf Ebrahimi           !( defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&
66*62c56f98SSadaf Ebrahimi              defined(MBEDTLS_PLATFORM_FREE_MACRO) ) */
67*62c56f98SSadaf Ebrahimi 
68*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_HAS_NON_CONFORMING_SNPRINTF)
69*62c56f98SSadaf Ebrahimi #include <stdarg.h>
mbedtls_platform_win32_snprintf(char * s,size_t n,const char * fmt,...)70*62c56f98SSadaf Ebrahimi int mbedtls_platform_win32_snprintf(char *s, size_t n, const char *fmt, ...)
71*62c56f98SSadaf Ebrahimi {
72*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
73*62c56f98SSadaf Ebrahimi     va_list argp;
74*62c56f98SSadaf Ebrahimi 
75*62c56f98SSadaf Ebrahimi     va_start(argp, fmt);
76*62c56f98SSadaf Ebrahimi     ret = mbedtls_vsnprintf(s, n, fmt, argp);
77*62c56f98SSadaf Ebrahimi     va_end(argp);
78*62c56f98SSadaf Ebrahimi 
79*62c56f98SSadaf Ebrahimi     return ret;
80*62c56f98SSadaf Ebrahimi }
81*62c56f98SSadaf Ebrahimi #endif
82*62c56f98SSadaf Ebrahimi 
83*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT)
84*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF)
85*62c56f98SSadaf Ebrahimi /*
86*62c56f98SSadaf Ebrahimi  * Make dummy function to prevent NULL pointer dereferences
87*62c56f98SSadaf Ebrahimi  */
platform_snprintf_uninit(char * s,size_t n,const char * format,...)88*62c56f98SSadaf Ebrahimi static int platform_snprintf_uninit(char *s, size_t n,
89*62c56f98SSadaf Ebrahimi                                     const char *format, ...)
90*62c56f98SSadaf Ebrahimi {
91*62c56f98SSadaf Ebrahimi     ((void) s);
92*62c56f98SSadaf Ebrahimi     ((void) n);
93*62c56f98SSadaf Ebrahimi     ((void) format);
94*62c56f98SSadaf Ebrahimi     return 0;
95*62c56f98SSadaf Ebrahimi }
96*62c56f98SSadaf Ebrahimi 
97*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_SNPRINTF    platform_snprintf_uninit
98*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_SNPRINTF */
99*62c56f98SSadaf Ebrahimi 
100*62c56f98SSadaf Ebrahimi int (*mbedtls_snprintf)(char *s, size_t n,
101*62c56f98SSadaf Ebrahimi                         const char *format,
102*62c56f98SSadaf Ebrahimi                         ...) = MBEDTLS_PLATFORM_STD_SNPRINTF;
103*62c56f98SSadaf Ebrahimi 
mbedtls_platform_set_snprintf(int (* snprintf_func)(char * s,size_t n,const char * format,...))104*62c56f98SSadaf Ebrahimi int mbedtls_platform_set_snprintf(int (*snprintf_func)(char *s, size_t n,
105*62c56f98SSadaf Ebrahimi                                                        const char *format,
106*62c56f98SSadaf Ebrahimi                                                        ...))
107*62c56f98SSadaf Ebrahimi {
108*62c56f98SSadaf Ebrahimi     mbedtls_snprintf = snprintf_func;
109*62c56f98SSadaf Ebrahimi     return 0;
110*62c56f98SSadaf Ebrahimi }
111*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */
112*62c56f98SSadaf Ebrahimi 
113*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_HAS_NON_CONFORMING_VSNPRINTF)
114*62c56f98SSadaf Ebrahimi #include <stdarg.h>
mbedtls_platform_win32_vsnprintf(char * s,size_t n,const char * fmt,va_list arg)115*62c56f98SSadaf Ebrahimi int mbedtls_platform_win32_vsnprintf(char *s, size_t n, const char *fmt, va_list arg)
116*62c56f98SSadaf Ebrahimi {
117*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
118*62c56f98SSadaf Ebrahimi 
119*62c56f98SSadaf Ebrahimi     /* Avoid calling the invalid parameter handler by checking ourselves */
120*62c56f98SSadaf Ebrahimi     if (s == NULL || n == 0 || fmt == NULL) {
121*62c56f98SSadaf Ebrahimi         return -1;
122*62c56f98SSadaf Ebrahimi     }
123*62c56f98SSadaf Ebrahimi 
124*62c56f98SSadaf Ebrahimi #if defined(_TRUNCATE)
125*62c56f98SSadaf Ebrahimi     ret = vsnprintf_s(s, n, _TRUNCATE, fmt, arg);
126*62c56f98SSadaf Ebrahimi #else
127*62c56f98SSadaf Ebrahimi     ret = vsnprintf(s, n, fmt, arg);
128*62c56f98SSadaf Ebrahimi     if (ret < 0 || (size_t) ret == n) {
129*62c56f98SSadaf Ebrahimi         s[n-1] = '\0';
130*62c56f98SSadaf Ebrahimi         ret = -1;
131*62c56f98SSadaf Ebrahimi     }
132*62c56f98SSadaf Ebrahimi #endif
133*62c56f98SSadaf Ebrahimi 
134*62c56f98SSadaf Ebrahimi     return ret;
135*62c56f98SSadaf Ebrahimi }
136*62c56f98SSadaf Ebrahimi #endif
137*62c56f98SSadaf Ebrahimi 
138*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_VSNPRINTF_ALT)
139*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_VSNPRINTF)
140*62c56f98SSadaf Ebrahimi /*
141*62c56f98SSadaf Ebrahimi  * Make dummy function to prevent NULL pointer dereferences
142*62c56f98SSadaf Ebrahimi  */
platform_vsnprintf_uninit(char * s,size_t n,const char * format,va_list arg)143*62c56f98SSadaf Ebrahimi static int platform_vsnprintf_uninit(char *s, size_t n,
144*62c56f98SSadaf Ebrahimi                                      const char *format, va_list arg)
145*62c56f98SSadaf Ebrahimi {
146*62c56f98SSadaf Ebrahimi     ((void) s);
147*62c56f98SSadaf Ebrahimi     ((void) n);
148*62c56f98SSadaf Ebrahimi     ((void) format);
149*62c56f98SSadaf Ebrahimi     ((void) arg);
150*62c56f98SSadaf Ebrahimi     return -1;
151*62c56f98SSadaf Ebrahimi }
152*62c56f98SSadaf Ebrahimi 
153*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_VSNPRINTF    platform_vsnprintf_uninit
154*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_VSNPRINTF */
155*62c56f98SSadaf Ebrahimi 
156*62c56f98SSadaf Ebrahimi int (*mbedtls_vsnprintf)(char *s, size_t n,
157*62c56f98SSadaf Ebrahimi                          const char *format,
158*62c56f98SSadaf Ebrahimi                          va_list arg) = MBEDTLS_PLATFORM_STD_VSNPRINTF;
159*62c56f98SSadaf Ebrahimi 
mbedtls_platform_set_vsnprintf(int (* vsnprintf_func)(char * s,size_t n,const char * format,va_list arg))160*62c56f98SSadaf Ebrahimi int mbedtls_platform_set_vsnprintf(int (*vsnprintf_func)(char *s, size_t n,
161*62c56f98SSadaf Ebrahimi                                                          const char *format,
162*62c56f98SSadaf Ebrahimi                                                          va_list arg))
163*62c56f98SSadaf Ebrahimi {
164*62c56f98SSadaf Ebrahimi     mbedtls_vsnprintf = vsnprintf_func;
165*62c56f98SSadaf Ebrahimi     return 0;
166*62c56f98SSadaf Ebrahimi }
167*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_VSNPRINTF_ALT */
168*62c56f98SSadaf Ebrahimi 
169*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_PRINTF_ALT)
170*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_PRINTF)
171*62c56f98SSadaf Ebrahimi /*
172*62c56f98SSadaf Ebrahimi  * Make dummy function to prevent NULL pointer dereferences
173*62c56f98SSadaf Ebrahimi  */
platform_printf_uninit(const char * format,...)174*62c56f98SSadaf Ebrahimi static int platform_printf_uninit(const char *format, ...)
175*62c56f98SSadaf Ebrahimi {
176*62c56f98SSadaf Ebrahimi     ((void) format);
177*62c56f98SSadaf Ebrahimi     return 0;
178*62c56f98SSadaf Ebrahimi }
179*62c56f98SSadaf Ebrahimi 
180*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_PRINTF    platform_printf_uninit
181*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_PRINTF */
182*62c56f98SSadaf Ebrahimi 
183*62c56f98SSadaf Ebrahimi int (*mbedtls_printf)(const char *, ...) = MBEDTLS_PLATFORM_STD_PRINTF;
184*62c56f98SSadaf Ebrahimi 
mbedtls_platform_set_printf(int (* printf_func)(const char *,...))185*62c56f98SSadaf Ebrahimi int mbedtls_platform_set_printf(int (*printf_func)(const char *, ...))
186*62c56f98SSadaf Ebrahimi {
187*62c56f98SSadaf Ebrahimi     mbedtls_printf = printf_func;
188*62c56f98SSadaf Ebrahimi     return 0;
189*62c56f98SSadaf Ebrahimi }
190*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */
191*62c56f98SSadaf Ebrahimi 
192*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT)
193*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_FPRINTF)
194*62c56f98SSadaf Ebrahimi /*
195*62c56f98SSadaf Ebrahimi  * Make dummy function to prevent NULL pointer dereferences
196*62c56f98SSadaf Ebrahimi  */
platform_fprintf_uninit(FILE * stream,const char * format,...)197*62c56f98SSadaf Ebrahimi static int platform_fprintf_uninit(FILE *stream, const char *format, ...)
198*62c56f98SSadaf Ebrahimi {
199*62c56f98SSadaf Ebrahimi     ((void) stream);
200*62c56f98SSadaf Ebrahimi     ((void) format);
201*62c56f98SSadaf Ebrahimi     return 0;
202*62c56f98SSadaf Ebrahimi }
203*62c56f98SSadaf Ebrahimi 
204*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_FPRINTF   platform_fprintf_uninit
205*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_FPRINTF */
206*62c56f98SSadaf Ebrahimi 
207*62c56f98SSadaf Ebrahimi int (*mbedtls_fprintf)(FILE *, const char *, ...) =
208*62c56f98SSadaf Ebrahimi     MBEDTLS_PLATFORM_STD_FPRINTF;
209*62c56f98SSadaf Ebrahimi 
mbedtls_platform_set_fprintf(int (* fprintf_func)(FILE *,const char *,...))210*62c56f98SSadaf Ebrahimi int mbedtls_platform_set_fprintf(int (*fprintf_func)(FILE *, const char *, ...))
211*62c56f98SSadaf Ebrahimi {
212*62c56f98SSadaf Ebrahimi     mbedtls_fprintf = fprintf_func;
213*62c56f98SSadaf Ebrahimi     return 0;
214*62c56f98SSadaf Ebrahimi }
215*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */
216*62c56f98SSadaf Ebrahimi 
217*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_SETBUF_ALT)
218*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_SETBUF)
219*62c56f98SSadaf Ebrahimi /*
220*62c56f98SSadaf Ebrahimi  * Make dummy function to prevent NULL pointer dereferences
221*62c56f98SSadaf Ebrahimi  */
platform_setbuf_uninit(FILE * stream,char * buf)222*62c56f98SSadaf Ebrahimi static void platform_setbuf_uninit(FILE *stream, char *buf)
223*62c56f98SSadaf Ebrahimi {
224*62c56f98SSadaf Ebrahimi     ((void) stream);
225*62c56f98SSadaf Ebrahimi     ((void) buf);
226*62c56f98SSadaf Ebrahimi }
227*62c56f98SSadaf Ebrahimi 
228*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_SETBUF   platform_setbuf_uninit
229*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_SETBUF */
230*62c56f98SSadaf Ebrahimi void (*mbedtls_setbuf)(FILE *stream, char *buf) = MBEDTLS_PLATFORM_STD_SETBUF;
231*62c56f98SSadaf Ebrahimi 
mbedtls_platform_set_setbuf(void (* setbuf_func)(FILE * stream,char * buf))232*62c56f98SSadaf Ebrahimi int mbedtls_platform_set_setbuf(void (*setbuf_func)(FILE *stream, char *buf))
233*62c56f98SSadaf Ebrahimi {
234*62c56f98SSadaf Ebrahimi     mbedtls_setbuf = setbuf_func;
235*62c56f98SSadaf Ebrahimi     return 0;
236*62c56f98SSadaf Ebrahimi }
237*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_SETBUF_ALT */
238*62c56f98SSadaf Ebrahimi 
239*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_EXIT_ALT)
240*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_EXIT)
241*62c56f98SSadaf Ebrahimi /*
242*62c56f98SSadaf Ebrahimi  * Make dummy function to prevent NULL pointer dereferences
243*62c56f98SSadaf Ebrahimi  */
platform_exit_uninit(int status)244*62c56f98SSadaf Ebrahimi static void platform_exit_uninit(int status)
245*62c56f98SSadaf Ebrahimi {
246*62c56f98SSadaf Ebrahimi     ((void) status);
247*62c56f98SSadaf Ebrahimi }
248*62c56f98SSadaf Ebrahimi 
249*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_EXIT   platform_exit_uninit
250*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_EXIT */
251*62c56f98SSadaf Ebrahimi 
252*62c56f98SSadaf Ebrahimi void (*mbedtls_exit)(int status) = MBEDTLS_PLATFORM_STD_EXIT;
253*62c56f98SSadaf Ebrahimi 
mbedtls_platform_set_exit(void (* exit_func)(int status))254*62c56f98SSadaf Ebrahimi int mbedtls_platform_set_exit(void (*exit_func)(int status))
255*62c56f98SSadaf Ebrahimi {
256*62c56f98SSadaf Ebrahimi     mbedtls_exit = exit_func;
257*62c56f98SSadaf Ebrahimi     return 0;
258*62c56f98SSadaf Ebrahimi }
259*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_EXIT_ALT */
260*62c56f98SSadaf Ebrahimi 
261*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME)
262*62c56f98SSadaf Ebrahimi 
263*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_TIME_ALT)
264*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_TIME)
265*62c56f98SSadaf Ebrahimi /*
266*62c56f98SSadaf Ebrahimi  * Make dummy function to prevent NULL pointer dereferences
267*62c56f98SSadaf Ebrahimi  */
platform_time_uninit(mbedtls_time_t * timer)268*62c56f98SSadaf Ebrahimi static mbedtls_time_t platform_time_uninit(mbedtls_time_t *timer)
269*62c56f98SSadaf Ebrahimi {
270*62c56f98SSadaf Ebrahimi     ((void) timer);
271*62c56f98SSadaf Ebrahimi     return 0;
272*62c56f98SSadaf Ebrahimi }
273*62c56f98SSadaf Ebrahimi 
274*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_TIME   platform_time_uninit
275*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_TIME */
276*62c56f98SSadaf Ebrahimi 
277*62c56f98SSadaf Ebrahimi mbedtls_time_t (*mbedtls_time)(mbedtls_time_t *timer) = MBEDTLS_PLATFORM_STD_TIME;
278*62c56f98SSadaf Ebrahimi 
mbedtls_platform_set_time(mbedtls_time_t (* time_func)(mbedtls_time_t * timer))279*62c56f98SSadaf Ebrahimi int mbedtls_platform_set_time(mbedtls_time_t (*time_func)(mbedtls_time_t *timer))
280*62c56f98SSadaf Ebrahimi {
281*62c56f98SSadaf Ebrahimi     mbedtls_time = time_func;
282*62c56f98SSadaf Ebrahimi     return 0;
283*62c56f98SSadaf Ebrahimi }
284*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_TIME_ALT */
285*62c56f98SSadaf Ebrahimi 
286*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_HAVE_TIME */
287*62c56f98SSadaf Ebrahimi 
288*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ENTROPY_NV_SEED)
289*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO)
290*62c56f98SSadaf Ebrahimi /* Default implementations for the platform independent seed functions use
291*62c56f98SSadaf Ebrahimi  * standard libc file functions to read from and write to a pre-defined filename
292*62c56f98SSadaf Ebrahimi  */
mbedtls_platform_std_nv_seed_read(unsigned char * buf,size_t buf_len)293*62c56f98SSadaf Ebrahimi int mbedtls_platform_std_nv_seed_read(unsigned char *buf, size_t buf_len)
294*62c56f98SSadaf Ebrahimi {
295*62c56f98SSadaf Ebrahimi     FILE *file;
296*62c56f98SSadaf Ebrahimi     size_t n;
297*62c56f98SSadaf Ebrahimi 
298*62c56f98SSadaf Ebrahimi     if ((file = fopen(MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "rb")) == NULL) {
299*62c56f98SSadaf Ebrahimi         return -1;
300*62c56f98SSadaf Ebrahimi     }
301*62c56f98SSadaf Ebrahimi 
302*62c56f98SSadaf Ebrahimi     /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
303*62c56f98SSadaf Ebrahimi     mbedtls_setbuf(file, NULL);
304*62c56f98SSadaf Ebrahimi 
305*62c56f98SSadaf Ebrahimi     if ((n = fread(buf, 1, buf_len, file)) != buf_len) {
306*62c56f98SSadaf Ebrahimi         fclose(file);
307*62c56f98SSadaf Ebrahimi         mbedtls_platform_zeroize(buf, buf_len);
308*62c56f98SSadaf Ebrahimi         return -1;
309*62c56f98SSadaf Ebrahimi     }
310*62c56f98SSadaf Ebrahimi 
311*62c56f98SSadaf Ebrahimi     fclose(file);
312*62c56f98SSadaf Ebrahimi     return (int) n;
313*62c56f98SSadaf Ebrahimi }
314*62c56f98SSadaf Ebrahimi 
mbedtls_platform_std_nv_seed_write(unsigned char * buf,size_t buf_len)315*62c56f98SSadaf Ebrahimi int mbedtls_platform_std_nv_seed_write(unsigned char *buf, size_t buf_len)
316*62c56f98SSadaf Ebrahimi {
317*62c56f98SSadaf Ebrahimi     FILE *file;
318*62c56f98SSadaf Ebrahimi     size_t n;
319*62c56f98SSadaf Ebrahimi 
320*62c56f98SSadaf Ebrahimi     if ((file = fopen(MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "w")) == NULL) {
321*62c56f98SSadaf Ebrahimi         return -1;
322*62c56f98SSadaf Ebrahimi     }
323*62c56f98SSadaf Ebrahimi 
324*62c56f98SSadaf Ebrahimi     /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
325*62c56f98SSadaf Ebrahimi     mbedtls_setbuf(file, NULL);
326*62c56f98SSadaf Ebrahimi 
327*62c56f98SSadaf Ebrahimi     if ((n = fwrite(buf, 1, buf_len, file)) != buf_len) {
328*62c56f98SSadaf Ebrahimi         fclose(file);
329*62c56f98SSadaf Ebrahimi         return -1;
330*62c56f98SSadaf Ebrahimi     }
331*62c56f98SSadaf Ebrahimi 
332*62c56f98SSadaf Ebrahimi     fclose(file);
333*62c56f98SSadaf Ebrahimi     return (int) n;
334*62c56f98SSadaf Ebrahimi }
335*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */
336*62c56f98SSadaf Ebrahimi 
337*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT)
338*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ)
339*62c56f98SSadaf Ebrahimi /*
340*62c56f98SSadaf Ebrahimi  * Make dummy function to prevent NULL pointer dereferences
341*62c56f98SSadaf Ebrahimi  */
platform_nv_seed_read_uninit(unsigned char * buf,size_t buf_len)342*62c56f98SSadaf Ebrahimi static int platform_nv_seed_read_uninit(unsigned char *buf, size_t buf_len)
343*62c56f98SSadaf Ebrahimi {
344*62c56f98SSadaf Ebrahimi     ((void) buf);
345*62c56f98SSadaf Ebrahimi     ((void) buf_len);
346*62c56f98SSadaf Ebrahimi     return -1;
347*62c56f98SSadaf Ebrahimi }
348*62c56f98SSadaf Ebrahimi 
349*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_NV_SEED_READ   platform_nv_seed_read_uninit
350*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_READ */
351*62c56f98SSadaf Ebrahimi 
352*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE)
353*62c56f98SSadaf Ebrahimi /*
354*62c56f98SSadaf Ebrahimi  * Make dummy function to prevent NULL pointer dereferences
355*62c56f98SSadaf Ebrahimi  */
platform_nv_seed_write_uninit(unsigned char * buf,size_t buf_len)356*62c56f98SSadaf Ebrahimi static int platform_nv_seed_write_uninit(unsigned char *buf, size_t buf_len)
357*62c56f98SSadaf Ebrahimi {
358*62c56f98SSadaf Ebrahimi     ((void) buf);
359*62c56f98SSadaf Ebrahimi     ((void) buf_len);
360*62c56f98SSadaf Ebrahimi     return -1;
361*62c56f98SSadaf Ebrahimi }
362*62c56f98SSadaf Ebrahimi 
363*62c56f98SSadaf Ebrahimi #define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE   platform_nv_seed_write_uninit
364*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_WRITE */
365*62c56f98SSadaf Ebrahimi 
366*62c56f98SSadaf Ebrahimi int (*mbedtls_nv_seed_read)(unsigned char *buf, size_t buf_len) =
367*62c56f98SSadaf Ebrahimi     MBEDTLS_PLATFORM_STD_NV_SEED_READ;
368*62c56f98SSadaf Ebrahimi int (*mbedtls_nv_seed_write)(unsigned char *buf, size_t buf_len) =
369*62c56f98SSadaf Ebrahimi     MBEDTLS_PLATFORM_STD_NV_SEED_WRITE;
370*62c56f98SSadaf Ebrahimi 
mbedtls_platform_set_nv_seed(int (* nv_seed_read_func)(unsigned char * buf,size_t buf_len),int (* nv_seed_write_func)(unsigned char * buf,size_t buf_len))371*62c56f98SSadaf Ebrahimi int mbedtls_platform_set_nv_seed(
372*62c56f98SSadaf Ebrahimi     int (*nv_seed_read_func)(unsigned char *buf, size_t buf_len),
373*62c56f98SSadaf Ebrahimi     int (*nv_seed_write_func)(unsigned char *buf, size_t buf_len))
374*62c56f98SSadaf Ebrahimi {
375*62c56f98SSadaf Ebrahimi     mbedtls_nv_seed_read = nv_seed_read_func;
376*62c56f98SSadaf Ebrahimi     mbedtls_nv_seed_write = nv_seed_write_func;
377*62c56f98SSadaf Ebrahimi     return 0;
378*62c56f98SSadaf Ebrahimi }
379*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */
380*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_ENTROPY_NV_SEED */
381*62c56f98SSadaf Ebrahimi 
382*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT)
383*62c56f98SSadaf Ebrahimi /*
384*62c56f98SSadaf Ebrahimi  * Placeholder platform setup that does nothing by default
385*62c56f98SSadaf Ebrahimi  */
mbedtls_platform_setup(mbedtls_platform_context * ctx)386*62c56f98SSadaf Ebrahimi int mbedtls_platform_setup(mbedtls_platform_context *ctx)
387*62c56f98SSadaf Ebrahimi {
388*62c56f98SSadaf Ebrahimi     (void) ctx;
389*62c56f98SSadaf Ebrahimi 
390*62c56f98SSadaf Ebrahimi     return 0;
391*62c56f98SSadaf Ebrahimi }
392*62c56f98SSadaf Ebrahimi 
393*62c56f98SSadaf Ebrahimi /*
394*62c56f98SSadaf Ebrahimi  * Placeholder platform teardown that does nothing by default
395*62c56f98SSadaf Ebrahimi  */
mbedtls_platform_teardown(mbedtls_platform_context * ctx)396*62c56f98SSadaf Ebrahimi void mbedtls_platform_teardown(mbedtls_platform_context *ctx)
397*62c56f98SSadaf Ebrahimi {
398*62c56f98SSadaf Ebrahimi     (void) ctx;
399*62c56f98SSadaf Ebrahimi }
400*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */
401*62c56f98SSadaf Ebrahimi 
402*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PLATFORM_C */
403