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