memzero.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #ifndef __STDC_WANT_LIB_EXT1__
  2. #define __STDC_WANT_LIB_EXT1__ 1 // C11's bounds-checking interface.
  3. #endif
  4. #include <string.h>
  5. #ifdef _WIN32
  6. #include <windows.h>
  7. #endif
  8. #ifdef __unix__
  9. #include <strings.h>
  10. #include <sys/param.h>
  11. #endif
  12. // C11's bounds-checking interface.
  13. #if defined(__STDC_LIB_EXT1__)
  14. #define HAVE_MEMSET_S 1
  15. #endif
  16. // GNU C Library version 2.25 or later.
  17. #if defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 25))
  18. #define HAVE_EXPLICIT_BZERO 1
  19. #endif
  20. // Newlib
  21. #if defined(__NEWLIB__)
  22. #define HAVE_EXPLICIT_BZERO 1
  23. #endif
  24. // FreeBSD version 11.0 or later.
  25. #if defined(__FreeBSD__) && __FreeBSD_version >= 1100037
  26. #define HAVE_EXPLICIT_BZERO 1
  27. #endif
  28. // OpenBSD version 5.5 or later.
  29. #if defined(__OpenBSD__) && OpenBSD >= 201405
  30. #define HAVE_EXPLICIT_BZERO 1
  31. #endif
  32. // NetBSD version 7.2 or later.
  33. #if defined(__NetBSD__) && __NetBSD_Version__ >= 702000000
  34. #define HAVE_EXPLICIT_MEMSET 1
  35. #endif
  36. // Adapted from
  37. // https://github.com/jedisct1/libsodium/blob/1647f0d53ae0e370378a9195477e3df0a792408f/src/libsodium/sodium/utils.c#L102-L130
  38. void memzero(void* const pnt, const size_t len) {
  39. #ifdef _WIN32
  40. SecureZeroMemory(pnt, len);
  41. #elif defined(HAVE_MEMSET_S)
  42. memset_s(pnt, (rsize_t)len, 0, (rsize_t)len);
  43. // REMOVED - Flipper Zero does not have this function
  44. // #elif defined(HAVE_EXPLICIT_BZERO)
  45. // explicit_bzero(pnt, len);
  46. #elif defined(HAVE_EXPLICIT_MEMSET)
  47. explicit_memset(pnt, 0, len);
  48. #else
  49. volatile unsigned char* volatile pnt_ = (volatile unsigned char* volatile)pnt;
  50. size_t i = (size_t)0U;
  51. while(i < len) {
  52. pnt_[i++] = 0U;
  53. }
  54. #endif
  55. // explicitly mark the memory as overwritten for the Clang MemorySanitizer
  56. // this is only included at compile time if MemorySanitizer is enabled and
  57. // should not come with any downsides during regular builds
  58. #if defined(__has_feature)
  59. #if __has_feature(memory_sanitizer)
  60. memset(pnt, 0, len);
  61. #endif
  62. #endif
  63. }