8 #ifndef BOTAN_MEMORY_OPS_H__
9 #define BOTAN_MEMORY_OPS_H__
11 #include <botan/types.h>
43 std::memset(ptr, 0, bytes);
57 template<
typename T>
inline void clear_mem(T* ptr,
size_t n)
68 template<
typename T>
inline void copy_mem(T* out,
const T* in,
size_t n)
72 std::memmove(out, in,
sizeof(T)*n);
83 inline void set_mem(T* ptr,
size_t n, uint8_t val)
87 std::memset(ptr, val,
sizeof(T)*n);
98 template<
typename T>
inline bool same_mem(
const T* p1,
const T* p2,
size_t n)
100 volatile T difference = 0;
102 for(
size_t i = 0; i != n; ++i)
103 difference |= (p1[i] ^ p2[i]);
105 return difference == 0;
115 void xor_buf(T out[],
const T in[],
size_t length)
117 for(
size_t i = 0; i != length; ++i)
135 for(
size_t i = 0; i != length; ++i)
137 out[i] = in[i] ^ in2[i];
141 template<
typename Alloc,
typename Alloc2>
142 void xor_buf(std::vector<uint8_t, Alloc>& out,
143 const std::vector<uint8_t, Alloc2>& in,
146 xor_buf(out.data(), in.data(), n);
149 template<
typename Alloc>
150 void xor_buf(std::vector<uint8_t, Alloc>& out,
157 template<
typename Alloc,
typename Alloc2>
158 void xor_buf(std::vector<uint8_t, Alloc>& out,
160 const std::vector<uint8_t, Alloc2>& in2,
163 xor_buf(out.data(), in, in2.data(), n);
166 template<
typename T,
typename Alloc,
typename Alloc2>
167 std::vector<T, Alloc>&
169 const std::vector<T, Alloc2>& in)
171 if(out.size() < in.size())
172 out.resize(in.size());
174 xor_buf(out.data(), in.data(), in.size());
void clear_bytes(void *ptr, size_t bytes)
void xor_buf(T out[], const T in[], size_t length)
std::vector< T, Alloc > & operator^=(std::vector< T, Alloc > &out, const std::vector< T, Alloc2 > &in)
void secure_scrub_memory(void *ptr, size_t n)
bool same_mem(const T *p1, const T *p2, size_t n)
void clear_mem(T *ptr, size_t n)
void set_mem(T *ptr, size_t n, uint8_t val)
void copy_mem(T *out, const T *in, size_t n)