libpromeki main
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
securemem.h
Go to the documentation of this file.
1
8#pragma once
9
10#include <cstddef>
13#include <promeki/core/error.h>
14
15#if defined(PROMEKI_PLATFORM_WINDOWS)
16# include <Windows.h>
17# include <memoryapi.h>
18#elif defined(PROMEKI_PLATFORM_POSIX)
19# include <sys/mman.h>
20#endif
21
23
38inline void secureZero(void *ptr, size_t size) {
39 if(ptr == nullptr || size == 0) return;
40#if defined(PROMEKI_PLATFORM_WINDOWS)
41 SecureZeroMemory(ptr, size);
42#elif defined(PROMEKI_LIBC_GLIBC) && \
43 (PROMEKI_LIBC_GLIBC_VERSION_MAJOR > 2 || \
44 (PROMEKI_LIBC_GLIBC_VERSION_MAJOR == 2 && PROMEKI_LIBC_GLIBC_VERSION_MINOR >= 25))
45 explicit_bzero(ptr, size);
46#elif defined(PROMEKI_PLATFORM_BSD)
47 explicit_bzero(ptr, size);
48#else
49 volatile unsigned char *p = static_cast<volatile unsigned char *>(ptr);
50 while(size--) *p++ = 0;
51#endif
52}
53
64inline Error secureLock(void *ptr, size_t size) {
65 if(ptr == nullptr || size == 0) return Error::Ok;
66#if defined(PROMEKI_PLATFORM_WINDOWS)
67 if(VirtualLock(ptr, size) == 0) return Error::syserr();
68 return Error::Ok;
69#elif defined(PROMEKI_PLATFORM_POSIX)
70 if(mlock(ptr, size) != 0) return Error::syserr();
71# if defined(PROMEKI_PLATFORM_LINUX)
72 madvise(ptr, size, MADV_DONTDUMP);
73# endif
74 return Error::Ok;
75#else
77#endif
78}
79
90inline Error secureUnlock(void *ptr, size_t size) {
91 if(ptr == nullptr || size == 0) return Error::Ok;
92#if defined(PROMEKI_PLATFORM_WINDOWS)
93 if(VirtualUnlock(ptr, size) == 0) return Error::syserr();
94 return Error::Ok;
95#elif defined(PROMEKI_PLATFORM_POSIX)
96# if defined(PROMEKI_PLATFORM_LINUX)
97 madvise(ptr, size, MADV_DODUMP);
98# endif
99 if(munlock(ptr, size) != 0) return Error::syserr();
100 return Error::Ok;
101#else
102 return Error::NotSupported;
103#endif
104}
105
Lightweight error code wrapper for the promeki library.
Definition error.h:39
static Error syserr()
Creates an Error from the last system error.
@ NotSupported
Operation is not supported.
Definition error.h:82
@ Ok
No error.
Definition error.h:51
Dynamic array container wrapping std::vector.
Definition list.h:40
PROMEKI_NAMESPACE_BEGIN void secureZero(void *ptr, size_t size)
Securely zeros a memory region, guaranteed not to be optimized away.
Definition securemem.h:38
#define PROMEKI_NAMESPACE_BEGIN
Starts a promeki namespace block.
Definition namespace.h:14
#define PROMEKI_NAMESPACE_END
Ends a promeki namespace block.
Definition namespace.h:19
Error secureUnlock(void *ptr, size_t size)
Unlocks a memory region previously locked with secureLock().
Definition securemem.h:90
Error secureLock(void *ptr, size_t size)
Locks a memory region into physical RAM, preventing it from being swapped to disk.
Definition securemem.h:64