| #if defined(__has_include) | |
| #if __has_include("config.h") | |
| #include "config.h" | |
| #endif | |
| #endif | |
| #ifdef _WIN32 | |
| #include <windows.h> | |
| #endif | |
| #if defined(__APPLE__) && defined(__MACH__) | |
| #include <AvailabilityMacros.h> | |
| // memset_s is available from macOS 10.9, iOS 7, watchOS 2, and on all tvOS and visionOS versions. | |
| # if (defined(MAC_OS_X_VERSION_MIN_REQUIRED) && defined(MAC_OS_X_VERSION_10_9) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9)) | |
| # define APPLE_HAS_MEMSET_S | |
| # elif (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && defined(__IPHONE_7_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0)) | |
| # define APPLE_HAS_MEMSET_S | |
| # elif (defined(TARGET_OS_TV) && TARGET_OS_TV) | |
| # define APPLE_HAS_MEMSET_S | |
| # elif (defined(__WATCH_OS_VERSION_MIN_REQUIRED) && defined(__WATCHOS_2_0) && (__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_2_0)) | |
| # define APPLE_HAS_MEMSET_S | |
| # elif (defined(TARGET_OS_VISION) && TARGET_OS_VISION) | |
| # define APPLE_HAS_MEMSET_S | |
| # else | |
| # undef APPLE_HAS_MEMSET_S | |
| # endif | |
| #endif | |
| #if (defined(__APPLE__) && defined(__MACH__)) || defined(__linux__) || defined(__OpenBSD__) | |
| #define __STDC_WANT_LIB_EXT1__ 1 | |
| #include <string.h> | |
| #endif | |
| #if defined(__CYGWIN__) || defined(__FreeBSD__) || defined(__NetBSD__) | |
| #include <strings.h> | |
| #endif | |
| #include <stdlib.h> | |
| #include <stdio.h> | |
| #include <limits.h> | |
| #include <inttypes.h> | |
| /* This is now a hand-written header */ | |
| #include "lib_memzero0.h" | |
| #include "krml/internal/target.h" | |
| /* The F* formalization talks about the number of elements in the array. The C | |
| implementation wants a number of bytes in the array. KaRaMeL is aware of this | |
| and inserts a sizeof multiplication. */ | |
| void Lib_Memzero0_memzero0(void *dst, uint64_t len) { | |
| /* This is safe: karamel checks at run-time (if needed) that all object sizes | |
| fit within a size_t, so the size we receive has been checked at | |
| allocation-time, possibly via KRML_CHECK_SIZE, to fit in a size_t. */ | |
| size_t len_ = (size_t) len; | |
| #ifdef _WIN32 | |
| SecureZeroMemory(dst, len_); | |
| #elif defined(__APPLE__) && defined(__MACH__) && defined(APPLE_HAS_MEMSET_S) | |
| memset_s(dst, len_, 0, len_); | |
| #elif (defined(__linux__) && !defined(LINUX_NO_EXPLICIT_BZERO)) || defined(__CYGWIN__) || defined(__FreeBSD__) || defined(__OpenBSD__) | |
| explicit_bzero(dst, len_); | |
| #elif defined(__NetBSD__) | |
| explicit_memset(dst, 0, len_); | |
| #else | |
| /* Default implementation for platforms with no particular support. */ | |
| #warning "Your platform does not support any safe implementation of memzero -- consider a pull request!" | |
| volatile unsigned char *volatile dst_ = (volatile unsigned char *volatile) dst; | |
| size_t i = 0U; | |
| while (i < len_) | |
| dst_[i++] = 0U; | |
| #endif | |
| } |