Botan  2.19.1
Crypto and TLS for C++11
Public Member Functions | Static Public Member Functions | Friends | List of all members
Botan::CT::Mask< T > Class Template Reference

#include <ct_utils.h>

Public Member Functions

T if_not_set_return (T x) const
 
T if_set_return (T x) const
 
void if_set_zero_out (T buf[], size_t elems)
 
bool is_set () const
 
 Mask (const Mask< T > &other)=default
 
template<typename U >
 Mask (Mask< U > o)
 
Mask< T > & operator&= (Mask< T > o)
 
Mask< T > & operator= (const Mask< T > &other)=default
 
Mask< T > & operator^= (Mask< T > o)
 
Mask< T > & operator|= (Mask< T > o)
 
Mask< Toperator~ () const
 
T select (T x, T y) const
 
T select_and_unpoison (T x, T y) const
 
Mask< Tselect_mask (Mask< T > x, Mask< T > y) const
 
void select_n (T output[], const T x[], const T y[], size_t len) const
 
T unpoisoned_value () const
 
T value () const
 

Static Public Member Functions

static Mask< Tcleared ()
 
static Mask< Texpand (T v)
 
template<typename U >
static Mask< Texpand (Mask< U > m)
 
static Mask< Tis_any_of (T v, std::initializer_list< T > accepted)
 
static Mask< Tis_equal (T x, T y)
 
static Mask< Tis_gt (T x, T y)
 
static Mask< Tis_gte (T x, T y)
 
static Mask< Tis_lt (T x, T y)
 
static Mask< Tis_lte (T x, T y)
 
static Mask< Tis_within_range (T v, T l, T u)
 
static Mask< Tis_zero (T x)
 
static Mask< Tset ()
 

Friends

Mask< Toperator& (Mask< T > x, Mask< T > y)
 
Mask< Toperator^ (Mask< T > x, Mask< T > y)
 
Mask< Toperator| (Mask< T > x, Mask< T > y)
 

Detailed Description

template<typename T>
class Botan::CT::Mask< T >

A Mask type used for constant-time operations. A Mask<T> always has value either 0 (all bits cleared) or ~0 (all bits set). All operations in a Mask<T> are intended to compile to code which does not contain conditional jumps. This must be verified with tooling (eg binary disassembly or using valgrind) since you never know what a compiler might do.

Definition at line 87 of file ct_utils.h.

Constructor & Destructor Documentation

template<typename T>
Botan::CT::Mask< T >::Mask ( const Mask< T > &  other)
default
template<typename T>
template<typename U >
Botan::CT::Mask< T >::Mask ( Mask< U >  o)
inline

Derive a Mask from a Mask of a larger type

Definition at line 99 of file ct_utils.h.

References T.

99  : m_mask(static_cast<T>(o.value()))
100  {
101  static_assert(sizeof(U) > sizeof(T), "sizes ok");
102  }
fe T
Definition: ge.cpp:37

Member Function Documentation

template<typename T>
static Mask<T> Botan::CT::Mask< T >::cleared ( )
inlinestatic

Return a Mask<T> with all bits cleared

Definition at line 115 of file ct_utils.h.

Referenced by Botan::low_zero_bits(), Botan::oaep_find_delim(), Botan::EME_PKCS1v15::unpad(), and Botan::OneAndZeros_Padding::unpad().

116  {
117  return Mask<T>(0);
118  }
template<typename T>
static Mask<T> Botan::CT::Mask< T >::expand ( T  v)
inlinestatic
template<typename T>
template<typename U >
static Mask<T> Botan::CT::Mask< T >::expand ( Mask< U >  m)
inlinestatic

Return a Mask<T> which is set if m is set

Definition at line 132 of file ct_utils.h.

References T, and Botan::CT::Mask< T >::value().

133  {
134  static_assert(sizeof(U) < sizeof(T), "sizes ok");
135  return ~Mask<T>::is_zero(m.value());
136  }
fe T
Definition: ge.cpp:37
template<typename T>
T Botan::CT::Mask< T >::if_not_set_return ( T  x) const
inline

Return x if the mask is cleared, or otherwise zero

Definition at line 280 of file ct_utils.h.

Referenced by Botan::CT::Mask< T >::if_set_zero_out(), and Botan::EME_PKCS1v15::unpad().

281  {
282  return ~m_mask & x;
283  }
template<typename T>
T Botan::CT::Mask< T >::if_set_return ( T  x) const
inline

Return x if the mask is set, or otherwise zero

Definition at line 272 of file ct_utils.h.

Referenced by Botan::oaep_find_delim().

273  {
274  return m_mask & x;
275  }
template<typename T>
void Botan::CT::Mask< T >::if_set_zero_out ( T  buf[],
size_t  elems 
)
inline

If this mask is set, zero out buf, otherwise do nothing

Definition at line 322 of file ct_utils.h.

References Botan::CT::Mask< T >::if_not_set_return().

Referenced by Botan::CT::copy_output().

323  {
324  for(size_t i = 0; i != elems; ++i)
325  {
326  buf[i] = this->if_not_set_return(buf[i]);
327  }
328  }
T if_not_set_return(T x) const
Definition: ct_utils.h:280
template<typename T>
static Mask<T> Botan::CT::Mask< T >::is_any_of ( T  v,
std::initializer_list< T accepted 
)
inlinestatic

Definition at line 196 of file ct_utils.h.

References Botan::expand_top_bit(), and T.

197  {
198  T accept = 0;
199 
200  for(auto a: accepted)
201  {
202  const T diff = a ^ v;
203  const T eq_zero = ~diff & (diff - 1);
204  accept |= eq_zero;
205  }
206 
207  return Mask<T>(expand_top_bit(accept));
208  }
T expand_top_bit(T a)
Definition: bit_ops.h:23
fe T
Definition: ge.cpp:37
template<typename T>
static Mask<T> Botan::CT::Mask< T >::is_equal ( T  x,
T  y 
)
inlinestatic
template<typename T>
static Mask<T> Botan::CT::Mask< T >::is_gt ( T  x,
T  y 
)
inlinestatic

Return a Mask<T> which is set if x > y

Definition at line 165 of file ct_utils.h.

References Botan::CT::Mask< T >::is_lt().

Referenced by Botan::OneAndZeros_Padding::add_padding(), Botan::PKCS7_Padding::unpad(), Botan::ANSI_X923_Padding::unpad(), and Botan::ESP_Padding::unpad().

166  {
167  return Mask<T>::is_lt(y, x);
168  }
static Mask< T > is_lt(T x, T y)
Definition: ct_utils.h:157
template<typename T>
static Mask<T> Botan::CT::Mask< T >::is_gte ( T  x,
T  y 
)
inlinestatic

Return a Mask<T> which is set if x >= y

Definition at line 181 of file ct_utils.h.

Referenced by Botan::PKCS7_Padding::add_padding(), Botan::ANSI_X923_Padding::add_padding(), Botan::ESP_Padding::add_padding(), Botan::ct_divide_u8(), Botan::PKCS7_Padding::unpad(), and Botan::ANSI_X923_Padding::unpad().

182  {
183  return ~Mask<T>::is_lt(x, y);
184  }
template<typename T>
static Mask<T> Botan::CT::Mask< T >::is_lt ( T  x,
T  y 
)
inlinestatic

Return a Mask<T> which is set if x < y

Definition at line 157 of file ct_utils.h.

Referenced by Botan::bigint_cmp(), Botan::bigint_ct_is_lt(), Botan::TLS::check_tls_cbc_padding(), Botan::CT::Mask< T >::is_gt(), Botan::Sodium::sodium_compare(), and Botan::EME_PKCS1v15::unpad().

158  {
159  return Mask<T>(expand_top_bit<T>(x^((x^y) | ((x-y)^x))));
160  }
template<typename T>
static Mask<T> Botan::CT::Mask< T >::is_lte ( T  x,
T  y 
)
inlinestatic

Return a Mask<T> which is set if x <= y

Definition at line 173 of file ct_utils.h.

Referenced by Botan::TLS::check_tls_cbc_padding(), Botan::CT::copy_output(), and Botan::TLS::TLS_CBC_HMAC_AEAD_Decryption::finish().

174  {
175  return ~Mask<T>::is_gt(x, y);
176  }
template<typename T>
bool Botan::CT::Mask< T >::is_set ( ) const
inline

Return true iff this mask is set

Definition at line 343 of file ct_utils.h.

References Botan::CT::Mask< T >::unpoisoned_value().

344  {
345  return unpoisoned_value() != 0;
346  }
T unpoisoned_value() const
Definition: ct_utils.h:333
template<typename T>
static Mask<T> Botan::CT::Mask< T >::is_within_range ( T  v,
T  l,
T  u 
)
inlinestatic

Definition at line 186 of file ct_utils.h.

References Botan::expand_top_bit(), and T.

187  {
188  //return Mask<T>::is_gte(v, l) & Mask<T>::is_lte(v, u);
189 
190  const T v_lt_l = v^((v^l) | ((v-l)^v));
191  const T v_gt_u = u^((u^v) | ((u-v)^u));
192  const T either = v_lt_l | v_gt_u;
193  return ~Mask<T>(expand_top_bit(either));
194  }
T expand_top_bit(T a)
Definition: bit_ops.h:23
fe T
Definition: ge.cpp:37
template<typename T>
static Mask<T> Botan::CT::Mask< T >::is_zero ( T  x)
inlinestatic
template<typename T>
Mask<T>& Botan::CT::Mask< T >::operator&= ( Mask< T o)
inline

AND-combine two masks

Definition at line 213 of file ct_utils.h.

References Botan::CT::Mask< T >::value().

214  {
215  m_mask &= o.value();
216  return (*this);
217  }
template<typename T>
Mask<T>& Botan::CT::Mask< T >::operator= ( const Mask< T > &  other)
default
template<typename T>
Mask<T>& Botan::CT::Mask< T >::operator^= ( Mask< T o)
inline

XOR-combine two masks

Definition at line 222 of file ct_utils.h.

References Botan::CT::Mask< T >::value().

223  {
224  m_mask ^= o.value();
225  return (*this);
226  }
template<typename T>
Mask<T>& Botan::CT::Mask< T >::operator|= ( Mask< T o)
inline

OR-combine two masks

Definition at line 231 of file ct_utils.h.

References Botan::CT::Mask< T >::value().

232  {
233  m_mask |= o.value();
234  return (*this);
235  }
template<typename T>
Mask<T> Botan::CT::Mask< T >::operator~ ( ) const
inline

Negate this mask

Definition at line 264 of file ct_utils.h.

References Botan::CT::Mask< T >::value().

265  {
266  return Mask<T>(~value());
267  }
T value() const
Definition: ct_utils.h:351
template<typename T>
T Botan::CT::Mask< T >::select ( T  x,
T  y 
) const
inline

If this mask is set, return x, otherwise return y

Definition at line 288 of file ct_utils.h.

References T, and Botan::CT::Mask< T >::value().

Referenced by Botan::PKCS7_Padding::add_padding(), Botan::ANSI_X923_Padding::add_padding(), Botan::OneAndZeros_Padding::add_padding(), Botan::ESP_Padding::add_padding(), Botan::bigint_cnd_add_or_sub(), Botan::bigint_cnd_addsub(), Botan::CT::Mask< T >::select_and_unpoison(), Botan::CT::Mask< T >::select_mask(), and Botan::CT::Mask< T >::select_n().

289  {
290  // (x & value()) | (y & ~value())
291  return static_cast<T>(y ^ (value() & (x ^ y)));
292  }
T value() const
Definition: ct_utils.h:351
fe T
Definition: ge.cpp:37
template<typename T>
T Botan::CT::Mask< T >::select_and_unpoison ( T  x,
T  y 
) const
inline

Definition at line 294 of file ct_utils.h.

References Botan::CT::Mask< T >::select(), T, and Botan::CT::unpoison().

295  {
296  T r = this->select(x, y);
297  CT::unpoison(r);
298  return r;
299  }
T select(T x, T y) const
Definition: ct_utils.h:288
fe T
Definition: ge.cpp:37
void unpoison(const T *p, size_t n)
Definition: ct_utils.h:59
template<typename T>
Mask<T> Botan::CT::Mask< T >::select_mask ( Mask< T x,
Mask< T y 
) const
inline

If this mask is set, return x, otherwise return y

Definition at line 304 of file ct_utils.h.

References Botan::CT::Mask< T >::select(), and Botan::CT::Mask< T >::value().

305  {
306  return Mask<T>(select(x.value(), y.value()));
307  }
T select(T x, T y) const
Definition: ct_utils.h:288
template<typename T>
void Botan::CT::Mask< T >::select_n ( T  output[],
const T  x[],
const T  y[],
size_t  len 
) const
inline

Conditionally set output to x or y, depending on if mask is set or cleared (resp)

Definition at line 313 of file ct_utils.h.

References Botan::CT::Mask< T >::select().

314  {
315  for(size_t i = 0; i != len; ++i)
316  output[i] = this->select(x[i], y[i]);
317  }
T select(T x, T y) const
Definition: ct_utils.h:288
template<typename T>
static Mask<T> Botan::CT::Mask< T >::set ( )
inlinestatic

Return a Mask<T> with all bits set

Definition at line 107 of file ct_utils.h.

References T.

Referenced by Botan::oaep_find_delim(), and Botan::CT::strip_leading_zeros().

108  {
109  return Mask<T>(static_cast<T>(~0));
110  }
fe T
Definition: ge.cpp:37
template<typename T>
T Botan::CT::Mask< T >::unpoisoned_value ( ) const
inline

Return the value of the mask, unpoisoned

Definition at line 333 of file ct_utils.h.

References T, Botan::CT::unpoison(), and Botan::CT::Mask< T >::value().

Referenced by Botan::CT::Mask< T >::is_set().

334  {
335  T r = value();
336  CT::unpoison(r);
337  return r;
338  }
T value() const
Definition: ct_utils.h:351
fe T
Definition: ge.cpp:37
void unpoison(const T *p, size_t n)
Definition: ct_utils.h:59
template<typename T>
T Botan::CT::Mask< T >::value ( ) const
inline

Friends And Related Function Documentation

template<typename T>
Mask<T> operator& ( Mask< T x,
Mask< T y 
)
friend

AND-combine two masks

Definition at line 240 of file ct_utils.h.

241  {
242  return Mask<T>(x.value() & y.value());
243  }
template<typename T>
Mask<T> operator^ ( Mask< T x,
Mask< T y 
)
friend

XOR-combine two masks

Definition at line 248 of file ct_utils.h.

249  {
250  return Mask<T>(x.value() ^ y.value());
251  }
template<typename T>
Mask<T> operator| ( Mask< T x,
Mask< T y 
)
friend

OR-combine two masks

Definition at line 256 of file ct_utils.h.

257  {
258  return Mask<T>(x.value() | y.value());
259  }

The documentation for this class was generated from the following file: