14 #ifndef BOTAN_TIMING_ATTACK_CM_H__
15 #define BOTAN_TIMING_ATTACK_CM_H__
17 #include <botan/secmem.h>
20 #if defined(BOTAN_HAS_VALGRIND)
21 #include <valgrind/memcheck.h>
46 inline void poison(
const T* p,
size_t n)
48 #if defined(BOTAN_HAS_VALGRIND)
49 VALGRIND_MAKE_MEM_UNDEFINED(p, n *
sizeof(T));
59 #if defined(BOTAN_HAS_VALGRIND)
60 VALGRIND_MAKE_MEM_DEFINED(p, n *
sizeof(T));
70 #if defined(BOTAN_HAS_VALGRIND)
71 VALGRIND_MAKE_MEM_DEFINED(&p,
sizeof(T));
90 for(
size_t i = 1; i !=
sizeof(T)*8; i *= 2)
98 inline T
select(T mask, T from0, T from1)
100 return (from0 & mask) | (from1 & ~mask);
103 template<
typename PredT,
typename ValT>
106 return select(CT::expand_mask<ValT>(pred_val), val, static_cast<ValT>(0));
128 return expand_mask<T>(x < y);
134 return expand_mask<T>(x <= y);
146 for(
size_t i = 0; i != elems; ++i)
160 for(
size_t i = 0; i != elems; ++i)
169 return expand_mask<T>(a >> (
sizeof(T)*8-1));
175 const T a_larger = b - a;
182 const T a_larger = b - a;
188 size_t leading_zeros = 0;
190 uint8_t only_zeros = 0xFF;
192 for(
size_t i = 0; i != length; ++i)
195 leading_zeros += CT::select<uint8_t>(only_zeros, 1, 0);
void conditional_copy_mem(T value, T *to, const T *from0, const T *from1, size_t elems)
void poison(const T *p, size_t n)
std::vector< T, secure_allocator< T >> secure_vector
void cond_zero_mem(T cond, T *array, size_t elems)
T select(T mask, T from0, T from1)
ValT val_or_zero(PredT pred_val, ValT val)
void unpoison(const T *p, size_t n)
secure_vector< uint8_t > strip_leading_zeros(const uint8_t in[], size_t length)