Botan 3.5.0
Crypto and TLS for C&
Botan::CT::Mask< T > Class Template Referencefinal

#include <ct_utils.h>

Public Member Functions

constexpr bool as_bool () const
 
constexpr CT::Choice as_choice () const
 
constexpr T if_not_set_return (T x) const
 
constexpr T if_set_return (T x) const
 
constexpr void if_set_zero_out (T buf[], size_t elems)
 
 Mask (const Mask< T > &other)=default
 
template<typename U >
constexpr 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)
 
constexpr Mask< Toperator~ () const
 
constexpr T select (T x, T y) const
 
constexpr T select_and_unpoison (T x, T y) const
 
Mask< Tselect_mask (Mask< T > x, Mask< T > y) const
 
constexpr void select_n (T output[], const T x[], const T y[], size_t len) const
 
constexpr T unpoisoned_value () const
 
constexpr T value () const
 

Static Public Member Functions

static constexpr Mask< Tcleared ()
 
template<typename U >
static constexpr Mask< Texpand (Mask< U > m)
 
static constexpr Mask< Texpand (T v)
 
static constexpr Mask< Texpand_top_bit (T v)
 
static constexpr Mask< Tfrom_choice (Choice c)
 
static constexpr Mask< Tis_any_of (T v, std::initializer_list< T > accepted)
 
static constexpr Mask< Tis_equal (T x, T y)
 
static constexpr Mask< Tis_gt (T x, T y)
 
static constexpr Mask< Tis_gte (T x, T y)
 
static constexpr Mask< Tis_lt (T x, T y)
 
static constexpr Mask< Tis_lte (T x, T y)
 
static constexpr Mask< Tis_within_range (T v, T l, T u)
 
static constexpr Mask< Tis_zero (T x)
 
static constexpr 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 |1| (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 184 of file ct_utils.h.

Constructor & Destructor Documentation

◆ Mask() [1/2]

◆ Mask() [2/2]

template<typename T >
template<typename U >
Botan::CT::Mask< T >::Mask ( Mask< U > o)
inlineconstexpr

Derive a Mask from a Mask of a larger type

Definition at line 196 of file ct_utils.h.

196 : m_mask(static_cast<T>(o.value())) {
197 static_assert(sizeof(U) > sizeof(T), "sizes ok");
198 }
FE_25519 T
Definition ge.cpp:34

References T.

Member Function Documentation

◆ as_bool()

template<typename T >
bool Botan::CT::Mask< T >::as_bool ( ) const
inlineconstexpr

Unsafe conversion to bool

This conversion itself is (probably) constant time, but once the mask is reduced to a simple bool, it's entirely possible for the compiler to perform range analysis on the values, since there are just the two. As a consequence even if the caller is not using this in an obviously branchy way (if(mask.as_bool()) ...) a smart compiler may introduce branches depending on the value.

Definition at line 407 of file ct_utils.h.

407{ return unpoisoned_value() != 0; }
constexpr T unpoisoned_value() const
Definition ct_utils.h:391

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

◆ as_choice()

template<typename T >
CT::Choice Botan::CT::Mask< T >::as_choice ( ) const
inlineconstexpr

Return a Choice based on this mask

Definition at line 412 of file ct_utils.h.

static constexpr Choice from_int(T v)
Definition ct_utils.h:124

References Botan::CT::Choice::from_int(), and Botan::CT::Mask< T >::unpoisoned_value().

◆ cleared()

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

Return a Mask<T> of |0| (all bits cleared)

Definition at line 208 of file ct_utils.h.

208{ return Mask<T>(0); }
Mask(const Mask< T > &other)=default

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

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

◆ expand() [1/2]

template<typename T >
template<typename U >
static constexpr Mask< T > Botan::CT::Mask< T >::expand ( Mask< U > m)
inlinestaticconstexpr

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

Definition at line 237 of file ct_utils.h.

237 {
238 static_assert(sizeof(U) < sizeof(T), "sizes ok");
239 return ~Mask<T>::is_zero(m.value());
240 }

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

◆ expand() [2/2]

◆ expand_top_bit()

template<typename T >
static constexpr Mask< T > Botan::CT::Mask< T >::expand_top_bit ( T v)
inlinestaticconstexpr

Return a Mask<T> which is set if the top bit of v is set

Definition at line 231 of file ct_utils.h.

constexpr T expand_top_bit(T a)
Definition bit_ops.h:23

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

Referenced by Botan::ct_divide_word(), Botan::CT::Mask< T >::is_any_of(), and Botan::CT::Mask< T >::is_lt().

◆ from_choice()

template<typename T >
static constexpr Mask< T > Botan::CT::Mask< T >::from_choice ( Choice c)
inlinestaticconstexpr

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

Definition at line 218 of file ct_utils.h.

218 {
219 if constexpr(sizeof(T) <= sizeof(uint32_t)) {
220 // Take advantage of the fact that Choice's mask is always
221 // either |0| or |1|
222 return Mask<T>(static_cast<T>(c.value()));
223 } else {
224 return ~Mask<T>::is_zero(c.value());
225 }
226 }

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

Referenced by Botan::CT::conditional_assign_mem(), and Botan::AffineCurvePoint< FieldElement, Params >::serialize_compressed_to().

◆ if_not_set_return()

template<typename T >
T Botan::CT::Mask< T >::if_not_set_return ( T x) const
inlineconstexpr

Return x if the mask is cleared, or otherwise zero

Definition at line 351 of file ct_utils.h.

351{ return ~value() & x; }

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

◆ if_set_return()

template<typename T >
T Botan::CT::Mask< T >::if_set_return ( T x) const
inlineconstexpr

Return x if the mask is set, or otherwise zero

Definition at line 346 of file ct_utils.h.

346{ return value() & x; }
constexpr T value() const
Definition ct_utils.h:417

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

◆ if_set_zero_out()

template<typename T >
void Botan::CT::Mask< T >::if_set_zero_out ( T buf[],
size_t elems )
inlineconstexpr

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

Definition at line 382 of file ct_utils.h.

382 {
383 for(size_t i = 0; i != elems; ++i) {
384 buf[i] = this->if_not_set_return(buf[i]);
385 }
386 }
constexpr T if_not_set_return(T x) const
Definition ct_utils.h:351

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

◆ is_any_of()

template<typename T >
static constexpr Mask< T > Botan::CT::Mask< T >::is_any_of ( T v,
std::initializer_list< T > accepted )
inlinestaticconstexpr

Definition at line 287 of file ct_utils.h.

287 {
288 T accept = 0;
289
290 for(auto a : accepted) {
291 const T diff = a ^ v;
292 const T eq_zero = value_barrier<T>(~diff & (diff - 1));
293 accept |= eq_zero;
294 }
295
296 return Mask<T>::expand_top_bit(accept);
297 }
static constexpr Mask< T > expand_top_bit(T v)
Definition ct_utils.h:231

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

◆ is_equal()

◆ is_gt()

template<typename T >
static constexpr Mask< T > Botan::CT::Mask< T >::is_gt ( T x,
T y )
inlinestaticconstexpr

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

Definition at line 266 of file ct_utils.h.

266{ return Mask<T>::is_lt(y, x); }
static constexpr Mask< T > is_lt(T x, T y)
Definition ct_utils.h:258

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

Referenced by Botan::CT::copy_output(), Botan::ANSI_X923_Padding::unpad(), Botan::ESP_Padding::unpad(), and Botan::PKCS7_Padding::unpad().

◆ is_gte()

template<typename T >
static constexpr Mask< T > Botan::CT::Mask< T >::is_gte ( T x,
T y )
inlinestaticconstexpr

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

Definition at line 276 of file ct_utils.h.

276{ return ~Mask<T>::is_lt(x, y); }

Referenced by Botan::ct_divide_word(), Botan::ANSI_X923_Padding::unpad(), and Botan::PKCS7_Padding::unpad().

◆ is_lt()

template<typename T >
static constexpr Mask< T > Botan::CT::Mask< T >::is_lt ( T x,
T y )
inlinestaticconstexpr

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

Definition at line 258 of file ct_utils.h.

258 {
259 T u = x ^ ((x ^ y) | ((x - y) ^ x));
260 return Mask<T>::expand_top_bit(u);
261 }

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

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

◆ is_lte()

template<typename T >
static constexpr Mask< T > Botan::CT::Mask< T >::is_lte ( T x,
T y )
inlinestaticconstexpr

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

Definition at line 271 of file ct_utils.h.

271{ return ~Mask<T>::is_gt(x, y); }

Referenced by Botan::TLS::check_tls_cbc_padding(), and Botan::constant_time_compare().

◆ is_within_range()

template<typename T >
static constexpr Mask< T > Botan::CT::Mask< T >::is_within_range ( T v,
T l,
T u )
inlinestaticconstexpr

Definition at line 278 of file ct_utils.h.

278 {
279 //return Mask<T>::is_gte(v, l) & Mask<T>::is_lte(v, u);
280
281 const T v_lt_l = v ^ ((v ^ l) | ((v - l) ^ v));
282 const T v_gt_u = u ^ ((u ^ v) | ((u - v) ^ u));
283 const T either = value_barrier(v_lt_l) | value_barrier(v_gt_u);
284 return ~Mask<T>::expand_top_bit(either);
285 }

References T, and Botan::CT::value_barrier().

◆ is_zero()

◆ operator&=()

template<typename T >
Mask< T > & Botan::CT::Mask< T >::operator&= ( Mask< T > o)
inline

AND-combine two masks

Definition at line 302 of file ct_utils.h.

302 {
303 m_mask &= o.value();
304 return (*this);
305 }

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

◆ operator=()

template<typename T >
Mask< T > & Botan::CT::Mask< T >::operator= ( const Mask< T > & other)
default

◆ operator^=()

template<typename T >
Mask< T > & Botan::CT::Mask< T >::operator^= ( Mask< T > o)
inline

XOR-combine two masks

Definition at line 310 of file ct_utils.h.

310 {
311 m_mask ^= o.value();
312 return (*this);
313 }

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

◆ operator|=()

template<typename T >
Mask< T > & Botan::CT::Mask< T >::operator|= ( Mask< T > o)
inline

OR-combine two masks

Definition at line 318 of file ct_utils.h.

318 {
319 m_mask |= o.value();
320 return (*this);
321 }

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

◆ operator~()

template<typename T >
Mask< T > Botan::CT::Mask< T >::operator~ ( ) const
inlineconstexpr

Negate this mask

Definition at line 341 of file ct_utils.h.

341{ return Mask<T>(~value()); }

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

◆ select()

template<typename T >
T Botan::CT::Mask< T >::select ( T x,
T y ) const
inlineconstexpr

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

Definition at line 356 of file ct_utils.h.

356{ return choose(value(), x, y); }
constexpr T choose(T mask, T a, T b)
Definition bit_ops.h:193

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

Referenced by Botan::bigint_cnd_add_or_sub(), Botan::CT::Mask< T >::select_and_unpoison(), Botan::CT::Mask< T >::select_mask(), and Botan::CT::Mask< T >::select_n().

◆ select_and_unpoison()

template<typename T >
T Botan::CT::Mask< T >::select_and_unpoison ( T x,
T y ) const
inlineconstexpr

Definition at line 358 of file ct_utils.h.

358 {
359 T r = this->select(x, y);
360 CT::unpoison(r);
361 return r;
362 }
constexpr T select(T x, T y) const
Definition ct_utils.h:356
constexpr void unpoison(const T *p, size_t n)
Definition ct_utils.h:57

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

◆ select_mask()

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 367 of file ct_utils.h.

367{ return Mask<T>(select(x.value(), y.value())); }

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

◆ select_n()

template<typename T >
void Botan::CT::Mask< T >::select_n ( T output[],
const T x[],
const T y[],
size_t len ) const
inlineconstexpr

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

Definition at line 373 of file ct_utils.h.

373 {
374 for(size_t i = 0; i != len; ++i) {
375 output[i] = this->select(x[i], y[i]);
376 }
377 }

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

Referenced by Botan::bigint_cnd_add_or_sub(), and Botan::CT::conditional_copy_mem().

◆ set()

template<typename T >
static constexpr Mask< T > Botan::CT::Mask< T >::set ( )
inlinestaticconstexpr

Return a Mask<T> of |1| (all bits set)

Definition at line 203 of file ct_utils.h.

203{ return Mask<T>(static_cast<T>(~0)); }

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

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

◆ unpoisoned_value()

template<typename T >
T Botan::CT::Mask< T >::unpoisoned_value ( ) const
inlineconstexpr

Return the value of the mask, unpoisoned

Definition at line 391 of file ct_utils.h.

391 {
392 T r = value();
393 CT::unpoison(r);
394 return r;
395 }

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

Referenced by Botan::CT::Mask< T >::as_bool(), and Botan::CT::Mask< T >::as_choice().

◆ value()

Friends And Related Symbol Documentation

◆ operator&

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

AND-combine two masks

Definition at line 326 of file ct_utils.h.

326{ return Mask<T>(x.value() & y.value()); }

◆ operator^

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

XOR-combine two masks

Definition at line 331 of file ct_utils.h.

331{ return Mask<T>(x.value() ^ y.value()); }

◆ operator|

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

OR-combine two masks

Definition at line 336 of file ct_utils.h.

336{ return Mask<T>(x.value() | y.value()); }

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