diff --git a/lib/libcryptsetup.h b/lib/libcryptsetup.h index 88d03bab..e78867c7 100644 --- a/lib/libcryptsetup.h +++ b/lib/libcryptsetup.h @@ -3100,6 +3100,15 @@ void *crypt_safe_realloc(void *data, size_t size); */ void crypt_safe_memzero(void *data, size_t size); +/** + * Memcpy helper to avoid spilling sensitive data through additional registers + * + * @param dst pointer to memory to be written + * @param src pointer to memory to be copied + * @param size size of memory in bytes + */ +void *crypt_safe_memcpy(void *dst, const void *src, size_t size); + /** @} */ /** diff --git a/lib/libcryptsetup.sym b/lib/libcryptsetup.sym index 89d64680..eebc21ec 100644 --- a/lib/libcryptsetup.sym +++ b/lib/libcryptsetup.sym @@ -180,3 +180,8 @@ CRYPTSETUP_2.7 { crypt_set_keyring_to_link; crypt_wipe_hw_opal; } CRYPTSETUP_2.6; + +CRYPTSETUP_2.8 { + global: + crypt_safe_memcpy; +} CRYPTSETUP_2.7; diff --git a/lib/utils_safe_memory.c b/lib/utils_safe_memory.c index 9ebfadbf..de2745b0 100644 --- a/lib/utils_safe_memory.c +++ b/lib/utils_safe_memory.c @@ -42,6 +42,15 @@ void crypt_safe_memzero(void *data, size_t size) return crypt_backend_memzero(data, size); } +/* Memcpy helper to avoid spilling sensitive data through additional registers */ +void *crypt_safe_memcpy(void *dst, const void *src, size_t size) +{ + if (!dst || !src) + return NULL; + + return crypt_backend_memcpy(dst, src, size); +} + /* safe allocations */ void *crypt_safe_alloc(size_t size) {