xref: /reactos/dll/3rdparty/mbedtls/platform.c (revision d9e6c9b5)
1c2c66affSColin Finck /*
2c2c66affSColin Finck  *  Platform abstraction layer
3c2c66affSColin Finck  *
4c2c66affSColin Finck  *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved
5c2c66affSColin Finck  *  SPDX-License-Identifier: GPL-2.0
6c2c66affSColin Finck  *
7c2c66affSColin Finck  *  This program is free software; you can redistribute it and/or modify
8c2c66affSColin Finck  *  it under the terms of the GNU General Public License as published by
9c2c66affSColin Finck  *  the Free Software Foundation; either version 2 of the License, or
10c2c66affSColin Finck  *  (at your option) any later version.
11c2c66affSColin Finck  *
12c2c66affSColin Finck  *  This program is distributed in the hope that it will be useful,
13c2c66affSColin Finck  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14c2c66affSColin Finck  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15c2c66affSColin Finck  *  GNU General Public License for more details.
16c2c66affSColin Finck  *
17c2c66affSColin Finck  *  You should have received a copy of the GNU General Public License along
18c2c66affSColin Finck  *  with this program; if not, write to the Free Software Foundation, Inc.,
19c2c66affSColin Finck  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20c2c66affSColin Finck  *
21c2c66affSColin Finck  *  This file is part of mbed TLS (https://tls.mbed.org)
22c2c66affSColin Finck  */
23c2c66affSColin Finck 
24c2c66affSColin Finck #if !defined(MBEDTLS_CONFIG_FILE)
25c2c66affSColin Finck #include "mbedtls/config.h"
26c2c66affSColin Finck #else
27c2c66affSColin Finck #include MBEDTLS_CONFIG_FILE
28c2c66affSColin Finck #endif
29c2c66affSColin Finck 
30c2c66affSColin Finck #if defined(MBEDTLS_PLATFORM_C)
31c2c66affSColin Finck 
32c2c66affSColin Finck #include "mbedtls/platform.h"
33c2c66affSColin Finck 
34*d9e6c9b5SThomas Faber #if defined(MBEDTLS_ENTROPY_NV_SEED) && \
35*d9e6c9b5SThomas Faber     !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO)
36*d9e6c9b5SThomas Faber /* Implementation that should never be optimized out by the compiler */
37*d9e6c9b5SThomas Faber static void mbedtls_zeroize( void *v, size_t n ) {
38*d9e6c9b5SThomas Faber     volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;
39*d9e6c9b5SThomas Faber }
40*d9e6c9b5SThomas Faber #endif
41*d9e6c9b5SThomas Faber 
42c2c66affSColin Finck #if defined(MBEDTLS_PLATFORM_MEMORY)
43c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_STD_CALLOC)
44c2c66affSColin Finck static void *platform_calloc_uninit( size_t n, size_t size )
45c2c66affSColin Finck {
46c2c66affSColin Finck     ((void) n);
47c2c66affSColin Finck     ((void) size);
48c2c66affSColin Finck     return( NULL );
49c2c66affSColin Finck }
50c2c66affSColin Finck 
51c2c66affSColin Finck #define MBEDTLS_PLATFORM_STD_CALLOC   platform_calloc_uninit
52c2c66affSColin Finck #endif /* !MBEDTLS_PLATFORM_STD_CALLOC */
53c2c66affSColin Finck 
54c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_STD_FREE)
55c2c66affSColin Finck static void platform_free_uninit( void *ptr )
56c2c66affSColin Finck {
57c2c66affSColin Finck     ((void) ptr);
58c2c66affSColin Finck }
59c2c66affSColin Finck 
60c2c66affSColin Finck #define MBEDTLS_PLATFORM_STD_FREE     platform_free_uninit
61c2c66affSColin Finck #endif /* !MBEDTLS_PLATFORM_STD_FREE */
62c2c66affSColin Finck 
63c2c66affSColin Finck void * (*mbedtls_calloc)( size_t, size_t ) = MBEDTLS_PLATFORM_STD_CALLOC;
64c2c66affSColin Finck void (*mbedtls_free)( void * )     = MBEDTLS_PLATFORM_STD_FREE;
65c2c66affSColin Finck 
66c2c66affSColin Finck int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ),
67c2c66affSColin Finck                               void (*free_func)( void * ) )
68c2c66affSColin Finck {
69c2c66affSColin Finck     mbedtls_calloc = calloc_func;
70c2c66affSColin Finck     mbedtls_free = free_func;
71c2c66affSColin Finck     return( 0 );
72c2c66affSColin Finck }
73c2c66affSColin Finck #endif /* MBEDTLS_PLATFORM_MEMORY */
74c2c66affSColin Finck 
75c2c66affSColin Finck #if defined(_WIN32)
76c2c66affSColin Finck #include <stdarg.h>
77c2c66affSColin Finck int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... )
78c2c66affSColin Finck {
79c2c66affSColin Finck     int ret;
80c2c66affSColin Finck     va_list argp;
81c2c66affSColin Finck 
82c2c66affSColin Finck     /* Avoid calling the invalid parameter handler by checking ourselves */
83c2c66affSColin Finck     if( s == NULL || n == 0 || fmt == NULL )
84c2c66affSColin Finck         return( -1 );
85c2c66affSColin Finck 
86c2c66affSColin Finck     va_start( argp, fmt );
87*d9e6c9b5SThomas Faber #if defined(_TRUNCATE) && !defined(__MINGW32__)
88c2c66affSColin Finck     ret = _vsnprintf_s( s, n, _TRUNCATE, fmt, argp );
89c2c66affSColin Finck #else
90c2c66affSColin Finck     ret = _vsnprintf( s, n, fmt, argp );
91c2c66affSColin Finck     if( ret < 0 || (size_t) ret == n )
92c2c66affSColin Finck     {
93c2c66affSColin Finck         s[n-1] = '\0';
94c2c66affSColin Finck         ret = -1;
95c2c66affSColin Finck     }
96c2c66affSColin Finck #endif
97c2c66affSColin Finck     va_end( argp );
98c2c66affSColin Finck 
99c2c66affSColin Finck     return( ret );
100c2c66affSColin Finck }
101c2c66affSColin Finck #endif
102c2c66affSColin Finck 
103c2c66affSColin Finck #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT)
104c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF)
105c2c66affSColin Finck /*
106c2c66affSColin Finck  * Make dummy function to prevent NULL pointer dereferences
107c2c66affSColin Finck  */
108c2c66affSColin Finck static int platform_snprintf_uninit( char * s, size_t n,
109c2c66affSColin Finck                                      const char * format, ... )
110c2c66affSColin Finck {
111c2c66affSColin Finck     ((void) s);
112c2c66affSColin Finck     ((void) n);
113c2c66affSColin Finck     ((void) format);
114c2c66affSColin Finck     return( 0 );
115c2c66affSColin Finck }
116c2c66affSColin Finck 
117c2c66affSColin Finck #define MBEDTLS_PLATFORM_STD_SNPRINTF    platform_snprintf_uninit
118c2c66affSColin Finck #endif /* !MBEDTLS_PLATFORM_STD_SNPRINTF */
119c2c66affSColin Finck 
120c2c66affSColin Finck int (*mbedtls_snprintf)( char * s, size_t n,
121c2c66affSColin Finck                           const char * format,
122c2c66affSColin Finck                           ... ) = MBEDTLS_PLATFORM_STD_SNPRINTF;
123c2c66affSColin Finck 
124c2c66affSColin Finck int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n,
125c2c66affSColin Finck                                                  const char * format,
126c2c66affSColin Finck                                                  ... ) )
127c2c66affSColin Finck {
128c2c66affSColin Finck     mbedtls_snprintf = snprintf_func;
129c2c66affSColin Finck     return( 0 );
130c2c66affSColin Finck }
131c2c66affSColin Finck #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */
132c2c66affSColin Finck 
133c2c66affSColin Finck #if defined(MBEDTLS_PLATFORM_PRINTF_ALT)
134c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_STD_PRINTF)
135c2c66affSColin Finck /*
136c2c66affSColin Finck  * Make dummy function to prevent NULL pointer dereferences
137c2c66affSColin Finck  */
138c2c66affSColin Finck static int platform_printf_uninit( const char *format, ... )
139c2c66affSColin Finck {
140c2c66affSColin Finck     ((void) format);
141c2c66affSColin Finck     return( 0 );
142c2c66affSColin Finck }
143c2c66affSColin Finck 
144c2c66affSColin Finck #define MBEDTLS_PLATFORM_STD_PRINTF    platform_printf_uninit
145c2c66affSColin Finck #endif /* !MBEDTLS_PLATFORM_STD_PRINTF */
146c2c66affSColin Finck 
147c2c66affSColin Finck int (*mbedtls_printf)( const char *, ... ) = MBEDTLS_PLATFORM_STD_PRINTF;
148c2c66affSColin Finck 
149c2c66affSColin Finck int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) )
150c2c66affSColin Finck {
151c2c66affSColin Finck     mbedtls_printf = printf_func;
152c2c66affSColin Finck     return( 0 );
153c2c66affSColin Finck }
154c2c66affSColin Finck #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */
155c2c66affSColin Finck 
156c2c66affSColin Finck #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT)
157c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_STD_FPRINTF)
158c2c66affSColin Finck /*
159c2c66affSColin Finck  * Make dummy function to prevent NULL pointer dereferences
160c2c66affSColin Finck  */
161c2c66affSColin Finck static int platform_fprintf_uninit( FILE *stream, const char *format, ... )
162c2c66affSColin Finck {
163c2c66affSColin Finck     ((void) stream);
164c2c66affSColin Finck     ((void) format);
165c2c66affSColin Finck     return( 0 );
166c2c66affSColin Finck }
167c2c66affSColin Finck 
168c2c66affSColin Finck #define MBEDTLS_PLATFORM_STD_FPRINTF   platform_fprintf_uninit
169c2c66affSColin Finck #endif /* !MBEDTLS_PLATFORM_STD_FPRINTF */
170c2c66affSColin Finck 
171c2c66affSColin Finck int (*mbedtls_fprintf)( FILE *, const char *, ... ) =
172c2c66affSColin Finck                                         MBEDTLS_PLATFORM_STD_FPRINTF;
173c2c66affSColin Finck 
174c2c66affSColin Finck int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *, const char *, ... ) )
175c2c66affSColin Finck {
176c2c66affSColin Finck     mbedtls_fprintf = fprintf_func;
177c2c66affSColin Finck     return( 0 );
178c2c66affSColin Finck }
179c2c66affSColin Finck #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */
180c2c66affSColin Finck 
181c2c66affSColin Finck #if defined(MBEDTLS_PLATFORM_EXIT_ALT)
182c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_STD_EXIT)
183c2c66affSColin Finck /*
184c2c66affSColin Finck  * Make dummy function to prevent NULL pointer dereferences
185c2c66affSColin Finck  */
186c2c66affSColin Finck static void platform_exit_uninit( int status )
187c2c66affSColin Finck {
188c2c66affSColin Finck     ((void) status);
189c2c66affSColin Finck }
190c2c66affSColin Finck 
191c2c66affSColin Finck #define MBEDTLS_PLATFORM_STD_EXIT   platform_exit_uninit
192c2c66affSColin Finck #endif /* !MBEDTLS_PLATFORM_STD_EXIT */
193c2c66affSColin Finck 
194c2c66affSColin Finck void (*mbedtls_exit)( int status ) = MBEDTLS_PLATFORM_STD_EXIT;
195c2c66affSColin Finck 
196c2c66affSColin Finck int mbedtls_platform_set_exit( void (*exit_func)( int status ) )
197c2c66affSColin Finck {
198c2c66affSColin Finck     mbedtls_exit = exit_func;
199c2c66affSColin Finck     return( 0 );
200c2c66affSColin Finck }
201c2c66affSColin Finck #endif /* MBEDTLS_PLATFORM_EXIT_ALT */
202c2c66affSColin Finck 
203c2c66affSColin Finck #if defined(MBEDTLS_HAVE_TIME)
204c2c66affSColin Finck 
205c2c66affSColin Finck #if defined(MBEDTLS_PLATFORM_TIME_ALT)
206c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_STD_TIME)
207c2c66affSColin Finck /*
208c2c66affSColin Finck  * Make dummy function to prevent NULL pointer dereferences
209c2c66affSColin Finck  */
210c2c66affSColin Finck static mbedtls_time_t platform_time_uninit( mbedtls_time_t* timer )
211c2c66affSColin Finck {
212c2c66affSColin Finck     ((void) timer);
213c2c66affSColin Finck     return( 0 );
214c2c66affSColin Finck }
215c2c66affSColin Finck 
216c2c66affSColin Finck #define MBEDTLS_PLATFORM_STD_TIME   platform_time_uninit
217c2c66affSColin Finck #endif /* !MBEDTLS_PLATFORM_STD_TIME */
218c2c66affSColin Finck 
219c2c66affSColin Finck mbedtls_time_t (*mbedtls_time)( mbedtls_time_t* timer ) = MBEDTLS_PLATFORM_STD_TIME;
220c2c66affSColin Finck 
221c2c66affSColin Finck int mbedtls_platform_set_time( mbedtls_time_t (*time_func)( mbedtls_time_t* timer ) )
222c2c66affSColin Finck {
223c2c66affSColin Finck     mbedtls_time = time_func;
224c2c66affSColin Finck     return( 0 );
225c2c66affSColin Finck }
226c2c66affSColin Finck #endif /* MBEDTLS_PLATFORM_TIME_ALT */
227c2c66affSColin Finck 
228c2c66affSColin Finck #endif /* MBEDTLS_HAVE_TIME */
229c2c66affSColin Finck 
230c2c66affSColin Finck #if defined(MBEDTLS_ENTROPY_NV_SEED)
231c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO)
232c2c66affSColin Finck /* Default implementations for the platform independent seed functions use
233c2c66affSColin Finck  * standard libc file functions to read from and write to a pre-defined filename
234c2c66affSColin Finck  */
235c2c66affSColin Finck int mbedtls_platform_std_nv_seed_read( unsigned char *buf, size_t buf_len )
236c2c66affSColin Finck {
237c2c66affSColin Finck     FILE *file;
238c2c66affSColin Finck     size_t n;
239c2c66affSColin Finck 
240c2c66affSColin Finck     if( ( file = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "rb" ) ) == NULL )
241*d9e6c9b5SThomas Faber         return( -1 );
242c2c66affSColin Finck 
243c2c66affSColin Finck     if( ( n = fread( buf, 1, buf_len, file ) ) != buf_len )
244c2c66affSColin Finck     {
245c2c66affSColin Finck         fclose( file );
246*d9e6c9b5SThomas Faber         mbedtls_zeroize( buf, buf_len );
247*d9e6c9b5SThomas Faber         return( -1 );
248c2c66affSColin Finck     }
249c2c66affSColin Finck 
250c2c66affSColin Finck     fclose( file );
251c2c66affSColin Finck     return( (int)n );
252c2c66affSColin Finck }
253c2c66affSColin Finck 
254c2c66affSColin Finck int mbedtls_platform_std_nv_seed_write( unsigned char *buf, size_t buf_len )
255c2c66affSColin Finck {
256c2c66affSColin Finck     FILE *file;
257c2c66affSColin Finck     size_t n;
258c2c66affSColin Finck 
259c2c66affSColin Finck     if( ( file = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "w" ) ) == NULL )
260c2c66affSColin Finck         return -1;
261c2c66affSColin Finck 
262c2c66affSColin Finck     if( ( n = fwrite( buf, 1, buf_len, file ) ) != buf_len )
263c2c66affSColin Finck     {
264c2c66affSColin Finck         fclose( file );
265c2c66affSColin Finck         return -1;
266c2c66affSColin Finck     }
267c2c66affSColin Finck 
268c2c66affSColin Finck     fclose( file );
269c2c66affSColin Finck     return( (int)n );
270c2c66affSColin Finck }
271c2c66affSColin Finck #endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */
272c2c66affSColin Finck 
273c2c66affSColin Finck #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT)
274c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ)
275c2c66affSColin Finck /*
276c2c66affSColin Finck  * Make dummy function to prevent NULL pointer dereferences
277c2c66affSColin Finck  */
278c2c66affSColin Finck static int platform_nv_seed_read_uninit( unsigned char *buf, size_t buf_len )
279c2c66affSColin Finck {
280c2c66affSColin Finck     ((void) buf);
281c2c66affSColin Finck     ((void) buf_len);
282c2c66affSColin Finck     return( -1 );
283c2c66affSColin Finck }
284c2c66affSColin Finck 
285c2c66affSColin Finck #define MBEDTLS_PLATFORM_STD_NV_SEED_READ   platform_nv_seed_read_uninit
286c2c66affSColin Finck #endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_READ */
287c2c66affSColin Finck 
288c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE)
289c2c66affSColin Finck /*
290c2c66affSColin Finck  * Make dummy function to prevent NULL pointer dereferences
291c2c66affSColin Finck  */
292c2c66affSColin Finck static int platform_nv_seed_write_uninit( unsigned char *buf, size_t buf_len )
293c2c66affSColin Finck {
294c2c66affSColin Finck     ((void) buf);
295c2c66affSColin Finck     ((void) buf_len);
296c2c66affSColin Finck     return( -1 );
297c2c66affSColin Finck }
298c2c66affSColin Finck 
299c2c66affSColin Finck #define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE   platform_nv_seed_write_uninit
300c2c66affSColin Finck #endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_WRITE */
301c2c66affSColin Finck 
302c2c66affSColin Finck int (*mbedtls_nv_seed_read)( unsigned char *buf, size_t buf_len ) =
303c2c66affSColin Finck             MBEDTLS_PLATFORM_STD_NV_SEED_READ;
304c2c66affSColin Finck int (*mbedtls_nv_seed_write)( unsigned char *buf, size_t buf_len ) =
305c2c66affSColin Finck             MBEDTLS_PLATFORM_STD_NV_SEED_WRITE;
306c2c66affSColin Finck 
307c2c66affSColin Finck int mbedtls_platform_set_nv_seed(
308c2c66affSColin Finck         int (*nv_seed_read_func)( unsigned char *buf, size_t buf_len ),
309c2c66affSColin Finck         int (*nv_seed_write_func)( unsigned char *buf, size_t buf_len ) )
310c2c66affSColin Finck {
311c2c66affSColin Finck     mbedtls_nv_seed_read = nv_seed_read_func;
312c2c66affSColin Finck     mbedtls_nv_seed_write = nv_seed_write_func;
313c2c66affSColin Finck     return( 0 );
314c2c66affSColin Finck }
315c2c66affSColin Finck #endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */
316c2c66affSColin Finck #endif /* MBEDTLS_ENTROPY_NV_SEED */
317c2c66affSColin Finck 
318c2c66affSColin Finck #if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT)
319c2c66affSColin Finck /*
320c2c66affSColin Finck  * Placeholder platform setup that does nothing by default
321c2c66affSColin Finck  */
322c2c66affSColin Finck int mbedtls_platform_setup( mbedtls_platform_context *ctx )
323c2c66affSColin Finck {
324c2c66affSColin Finck     (void)ctx;
325c2c66affSColin Finck 
326c2c66affSColin Finck     return( 0 );
327c2c66affSColin Finck }
328c2c66affSColin Finck 
329c2c66affSColin Finck /*
330c2c66affSColin Finck  * Placeholder platform teardown that does nothing by default
331c2c66affSColin Finck  */
332c2c66affSColin Finck void mbedtls_platform_teardown( mbedtls_platform_context *ctx )
333c2c66affSColin Finck {
334c2c66affSColin Finck     (void)ctx;
335c2c66affSColin Finck }
336c2c66affSColin Finck #endif /* MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */
337c2c66affSColin Finck 
338c2c66affSColin Finck #endif /* MBEDTLS_PLATFORM_C */
339