platform.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. /*
  2. * Copyright (C) 2015-2018 Alibaba Group Holding Limited
  3. */
  4. #if !defined(MBEDTLS_CONFIG_FILE)
  5. #include "mbedtls/config.h"
  6. #else
  7. #include MBEDTLS_CONFIG_FILE
  8. #endif
  9. #if defined(MBEDTLS_PLATFORM_C)
  10. #include "mbedtls/platform.h"
  11. #if defined(MBEDTLS_PLATFORM_MEMORY)
  12. #if !defined(MBEDTLS_PLATFORM_STD_CALLOC)
  13. static void *platform_calloc_uninit( size_t n, size_t size )
  14. {
  15. ((void) n);
  16. ((void) size);
  17. return( NULL );
  18. }
  19. #define MBEDTLS_PLATFORM_STD_CALLOC platform_calloc_uninit
  20. #endif /* !MBEDTLS_PLATFORM_STD_CALLOC */
  21. #if !defined(MBEDTLS_PLATFORM_STD_FREE)
  22. static void platform_free_uninit( void *ptr )
  23. {
  24. ((void) ptr);
  25. }
  26. #define MBEDTLS_PLATFORM_STD_FREE platform_free_uninit
  27. #endif /* !MBEDTLS_PLATFORM_STD_FREE */
  28. void * (*mbedtls_calloc)( size_t, size_t ) = MBEDTLS_PLATFORM_STD_CALLOC;
  29. void (*mbedtls_free)( void * ) = MBEDTLS_PLATFORM_STD_FREE;
  30. int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ),
  31. void (*free_func)( void * ) )
  32. {
  33. mbedtls_calloc = calloc_func;
  34. mbedtls_free = free_func;
  35. return( 0 );
  36. }
  37. #endif /* MBEDTLS_PLATFORM_MEMORY */
  38. #if defined(_WIN32)
  39. #include <stdarg.h>
  40. int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... )
  41. {
  42. int ret;
  43. va_list argp;
  44. /* Avoid calling the invalid parameter handler by checking ourselves */
  45. if( s == NULL || n == 0 || fmt == NULL )
  46. return( -1 );
  47. va_start( argp, fmt );
  48. #if defined(_TRUNCATE)
  49. ret = _vsnprintf_s( s, n, _TRUNCATE, fmt, argp );
  50. #else
  51. ret = _vsnprintf( s, n, fmt, argp );
  52. if( ret < 0 || (size_t) ret == n )
  53. {
  54. s[n-1] = '\0';
  55. ret = -1;
  56. }
  57. #endif
  58. va_end( argp );
  59. return( ret );
  60. }
  61. #endif
  62. #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT)
  63. #if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF)
  64. /*
  65. * Make dummy function to prevent NULL pointer dereferences
  66. */
  67. static int platform_snprintf_uninit( char * s, size_t n,
  68. const char * format, ... )
  69. {
  70. ((void) s);
  71. ((void) n);
  72. ((void) format);
  73. return( 0 );
  74. }
  75. #define MBEDTLS_PLATFORM_STD_SNPRINTF platform_snprintf_uninit
  76. #endif /* !MBEDTLS_PLATFORM_STD_SNPRINTF */
  77. int (*mbedtls_snprintf)( char * s, size_t n,
  78. const char * format,
  79. ... ) = MBEDTLS_PLATFORM_STD_SNPRINTF;
  80. int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n,
  81. const char * format,
  82. ... ) )
  83. {
  84. mbedtls_snprintf = snprintf_func;
  85. return( 0 );
  86. }
  87. #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */
  88. #if defined(MBEDTLS_PLATFORM_PRINTF_ALT)
  89. #if !defined(MBEDTLS_PLATFORM_STD_PRINTF)
  90. /*
  91. * Make dummy function to prevent NULL pointer dereferences
  92. */
  93. static int platform_printf_uninit( const char *format, ... )
  94. {
  95. ((void) format);
  96. return( 0 );
  97. }
  98. #define MBEDTLS_PLATFORM_STD_PRINTF platform_printf_uninit
  99. #endif /* !MBEDTLS_PLATFORM_STD_PRINTF */
  100. int (*mbedtls_printf)( const char *, ... ) = MBEDTLS_PLATFORM_STD_PRINTF;
  101. int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) )
  102. {
  103. mbedtls_printf = printf_func;
  104. return( 0 );
  105. }
  106. #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */
  107. #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT)
  108. #if !defined(MBEDTLS_PLATFORM_STD_FPRINTF)
  109. /*
  110. * Make dummy function to prevent NULL pointer dereferences
  111. */
  112. static int platform_fprintf_uninit( FILE *stream, const char *format, ... )
  113. {
  114. ((void) stream);
  115. ((void) format);
  116. return( 0 );
  117. }
  118. #define MBEDTLS_PLATFORM_STD_FPRINTF platform_fprintf_uninit
  119. #endif /* !MBEDTLS_PLATFORM_STD_FPRINTF */
  120. int (*mbedtls_fprintf)( FILE *, const char *, ... ) =
  121. MBEDTLS_PLATFORM_STD_FPRINTF;
  122. int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *, const char *, ... ) )
  123. {
  124. mbedtls_fprintf = fprintf_func;
  125. return( 0 );
  126. }
  127. #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */
  128. #if defined(MBEDTLS_PLATFORM_EXIT_ALT)
  129. #if !defined(MBEDTLS_PLATFORM_STD_EXIT)
  130. /*
  131. * Make dummy function to prevent NULL pointer dereferences
  132. */
  133. static void platform_exit_uninit( int status )
  134. {
  135. ((void) status);
  136. }
  137. #define MBEDTLS_PLATFORM_STD_EXIT platform_exit_uninit
  138. #endif /* !MBEDTLS_PLATFORM_STD_EXIT */
  139. void (*mbedtls_exit)( int status ) = MBEDTLS_PLATFORM_STD_EXIT;
  140. int mbedtls_platform_set_exit( void (*exit_func)( int status ) )
  141. {
  142. mbedtls_exit = exit_func;
  143. return( 0 );
  144. }
  145. #endif /* MBEDTLS_PLATFORM_EXIT_ALT */
  146. #if defined(MBEDTLS_HAVE_TIME)
  147. #if defined(MBEDTLS_PLATFORM_TIME_ALT)
  148. #if !defined(MBEDTLS_PLATFORM_STD_TIME)
  149. /*
  150. * Make dummy function to prevent NULL pointer dereferences
  151. */
  152. static mbedtls_time_t platform_time_uninit( mbedtls_time_t* timer )
  153. {
  154. ((void) timer);
  155. return( 0 );
  156. }
  157. #define MBEDTLS_PLATFORM_STD_TIME platform_time_uninit
  158. #endif /* !MBEDTLS_PLATFORM_STD_TIME */
  159. mbedtls_time_t (*mbedtls_time)( mbedtls_time_t* timer ) = MBEDTLS_PLATFORM_STD_TIME;
  160. int mbedtls_platform_set_time( mbedtls_time_t (*time_func)( mbedtls_time_t* timer ) )
  161. {
  162. mbedtls_time = time_func;
  163. return( 0 );
  164. }
  165. #endif /* MBEDTLS_PLATFORM_TIME_ALT */
  166. #endif /* MBEDTLS_HAVE_TIME */
  167. #if defined(MBEDTLS_ENTROPY_NV_SEED)
  168. #if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO)
  169. /* Default implementations for the platform independent seed functions use
  170. * standard libc file functions to read from and write to a pre-defined filename
  171. */
  172. int mbedtls_platform_std_nv_seed_read( unsigned char *buf, size_t buf_len )
  173. {
  174. FILE *file;
  175. size_t n;
  176. if( ( file = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "rb" ) ) == NULL )
  177. return -1;
  178. if( ( n = fread( buf, 1, buf_len, file ) ) != buf_len )
  179. {
  180. fclose( file );
  181. return -1;
  182. }
  183. fclose( file );
  184. return( (int)n );
  185. }
  186. int mbedtls_platform_std_nv_seed_write( unsigned char *buf, size_t buf_len )
  187. {
  188. FILE *file;
  189. size_t n;
  190. if( ( file = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "w" ) ) == NULL )
  191. return -1;
  192. if( ( n = fwrite( buf, 1, buf_len, file ) ) != buf_len )
  193. {
  194. fclose( file );
  195. return -1;
  196. }
  197. fclose( file );
  198. return( (int)n );
  199. }
  200. #endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */
  201. #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT)
  202. #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ)
  203. /*
  204. * Make dummy function to prevent NULL pointer dereferences
  205. */
  206. static int platform_nv_seed_read_uninit( unsigned char *buf, size_t buf_len )
  207. {
  208. ((void) buf);
  209. ((void) buf_len);
  210. return( -1 );
  211. }
  212. #define MBEDTLS_PLATFORM_STD_NV_SEED_READ platform_nv_seed_read_uninit
  213. #endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_READ */
  214. #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE)
  215. /*
  216. * Make dummy function to prevent NULL pointer dereferences
  217. */
  218. static int platform_nv_seed_write_uninit( unsigned char *buf, size_t buf_len )
  219. {
  220. ((void) buf);
  221. ((void) buf_len);
  222. return( -1 );
  223. }
  224. #define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE platform_nv_seed_write_uninit
  225. #endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_WRITE */
  226. int (*mbedtls_nv_seed_read)( unsigned char *buf, size_t buf_len ) =
  227. MBEDTLS_PLATFORM_STD_NV_SEED_READ;
  228. int (*mbedtls_nv_seed_write)( unsigned char *buf, size_t buf_len ) =
  229. MBEDTLS_PLATFORM_STD_NV_SEED_WRITE;
  230. int mbedtls_platform_set_nv_seed(
  231. int (*nv_seed_read_func)( unsigned char *buf, size_t buf_len ),
  232. int (*nv_seed_write_func)( unsigned char *buf, size_t buf_len ) )
  233. {
  234. mbedtls_nv_seed_read = nv_seed_read_func;
  235. mbedtls_nv_seed_write = nv_seed_write_func;
  236. return( 0 );
  237. }
  238. #endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */
  239. #endif /* MBEDTLS_ENTROPY_NV_SEED */
  240. #endif /* MBEDTLS_PLATFORM_C */