8#ifndef BOTAN_MEMORY_OPS_H_
9#define BOTAN_MEMORY_OPS_H_
11#include <botan/types.h>
101 std::memset(ptr, 0, bytes);
115template<
typename T>
inline constexpr void clear_mem(
T* ptr,
size_t n)
126template<
typename T>
inline constexpr void copy_mem(
T* out,
const T* in,
size_t n)
127 requires std::is_trivial<typename std::decay<T>::type>::value
130 "If n > 0 then args are not null");
132 if(in !=
nullptr && out !=
nullptr && n > 0)
134 std::memmove(out, in,
sizeof(
T)*n);
138template<
typename T>
inline constexpr void typecast_copy(uint8_t out[],
T in[],
size_t N)
139 requires std::is_trivially_copyable<T>::value
141 std::memcpy(out, in,
sizeof(
T)*N);
144template<
typename T>
inline constexpr void typecast_copy(
T out[],
const uint8_t in[],
size_t N)
145 requires std::is_trivial<T>::value
147 std::memcpy(out, in,
sizeof(
T)*N);
150template<
typename T>
inline constexpr void typecast_copy(uint8_t out[],
T in)
155template<
typename T>
inline constexpr void typecast_copy(
T& out,
const uint8_t in[])
156 requires std::is_trivial<typename std::decay<T>::type>::value
161template <
class To,
class FromT>
inline constexpr To
typecast_copy(
const FromT *src)
noexcept
162 requires std::is_trivially_copyable<FromT>::value && std::is_trivial<To>::value
165 std::memcpy(&dst, src,
sizeof(To));
175inline constexpr void set_mem(uint8_t* ptr,
size_t n, uint8_t val)
179 std::memset(ptr, val, n);
185 return reinterpret_cast<const uint8_t*
>(s);
190 return reinterpret_cast<const char*
>(b);
195 return reinterpret_cast<uint8_t*
>(s);
200 return reinterpret_cast<char*
>(b);
210template<
typename T>
inline bool same_mem(
const T* p1,
const T* p2,
size_t n)
212 volatile T difference = 0;
214 for(
size_t i = 0; i != n; ++i)
215 difference = difference | (p1[i] ^ p2[i]);
217 return difference == 0;
220template<
typename T,
typename Alloc>
227 const size_t to_copy = std::min(input_length, buf.size() - buf_offset);
230 copy_mem(&buf[buf_offset], input, to_copy);
235template<
typename T,
typename Alloc,
typename Alloc2>
238 const std::vector<T, Alloc2>& input)
241 const size_t to_copy = std::min(input.size(), buf.size() - buf_offset);
244 copy_mem(&buf[buf_offset], input.data(), to_copy);
259 const size_t blocks = length - (length % 32);
261 for(
size_t i = 0; i != blocks; i += 32)
277 for(
size_t i = blocks; i != length; ++i)
295 const size_t blocks = length - (length % 32);
297 for(
size_t i = 0; i != blocks; i += 32)
313 for(
size_t i = blocks; i != length; ++i)
315 out[i] = in[i] ^ in2[i];
319template<
typename Alloc,
typename Alloc2>
321 const std::vector<uint8_t, Alloc2>& in,
324 xor_buf(out.data(), in.data(), n);
327template<
typename Alloc>
335template<
typename Alloc,
typename Alloc2>
338 const std::vector<uint8_t, Alloc2>& in2,
341 xor_buf(out.data(), in, in2.data(), n);
344template<
typename Alloc,
typename Alloc2>
345std::vector<uint8_t, Alloc>&
347 const std::vector<uint8_t, Alloc2>& in)
349 if(out.size() < in.size())
350 out.resize(in.size());
352 xor_buf(out.data(), in.data(), in.size());
#define BOTAN_ASSERT_NOMSG(expr)
#define BOTAN_ASSERT_IMPLICATION(expr1, expr2, msg)
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
#define BOTAN_UNSTABLE_API
size_t buffer_insert(std::vector< T, Alloc > &buf, size_t buf_offset, const T input[], size_t input_length)
BOTAN_MALLOC_FN void * allocate_memory(size_t elems, size_t elem_size)
void deallocate_memory(void *p, size_t elems, size_t elem_size)
constexpr void clear_bytes(void *ptr, size_t bytes)
constexpr void copy_mem(T *out, const T *in, size_t n)
void secure_scrub_memory(void *ptr, size_t n)
bool constant_time_compare(const uint8_t x[], const uint8_t y[], size_t len)
uint8_t ct_compare_u8(const uint8_t x[], const uint8_t y[], size_t len)
std::vector< uint8_t, Alloc > & operator^=(std::vector< uint8_t, Alloc > &out, const std::vector< uint8_t, Alloc2 > &in)
void xor_buf(uint8_t out[], const uint8_t in[], size_t length)
void initialize_allocator()
bool same_mem(const T *p1, const T *p2, size_t n)
const char * cast_uint8_ptr_to_char(const uint8_t *b)
constexpr void typecast_copy(T &out, const uint8_t in[])
constexpr void clear_mem(T *ptr, size_t n)
const uint8_t * cast_char_ptr_to_uint8(const char *s)