diff --git a/src/libsodium/include/sodium/utils.h b/src/libsodium/include/sodium/utils.h index a4b4a1cf..46eb331c 100644 --- a/src/libsodium/include/sodium/utils.h +++ b/src/libsodium/include/sodium/utils.h @@ -21,6 +21,9 @@ extern "C" { SODIUM_EXPORT void sodium_memzero(void * const pnt, const size_t len); +SODIUM_EXPORT +void sodium_stackzero(const size_t len); + /* * WARNING: sodium_memcmp() must be used to verify if two secret keys * are equal, in constant time. diff --git a/src/libsodium/sodium/utils.c b/src/libsodium/sodium/utils.c index bb94fe88..b6ed31c4 100644 --- a/src/libsodium/sodium/utils.c +++ b/src/libsodium/sodium/utils.c @@ -21,6 +21,23 @@ # include #endif +#if HAVE_ALLOCA_H +# include +#elif defined __GNUC__ +# define alloca __builtin_alloca +#elif defined _AIX +# define alloca __alloca +#elif defined _MSC_VER +# include +# define alloca _alloca +#else +# include +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +#endif + #include "core.h" #include "randombytes.h" #include "utils.h" @@ -103,6 +120,17 @@ sodium_memzero(void *const pnt, const size_t len) #endif } +void +sodium_stackzero(const size_t len) +{ +#ifdef HAVE_ALLOCA + sodium_memzero(alloca(len), len); +#elif __STDC_VERSION__ >= 199901L + unsigned char fodder[len]; + sodium_memzero(fodder, len); +#endif +} + #ifdef HAVE_WEAK_SYMBOLS __attribute__((weak)) void _sodium_dummy_symbol_to_prevent_memcmp_lto(const unsigned char *b1,