subtle

Trait ConditionallySelectable

Source
pub trait ConditionallySelectable: Copy {
    // Required method
    fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self;

    // Provided methods
    fn conditional_assign(&mut self, other: &Self, choice: Choice) { ... }
    fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice) { ... }
}
Expand description

A type which can be conditionally selected in constant time.

This trait also provides generic implementations of conditional assignment and conditional swaps.

Required Methods§

Source

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Select a or b according to choice.

§Returns
  • a if choice == Choice(0);
  • b if choice == Choice(1).

This function should execute in constant time.

§Example
use subtle::ConditionallySelectable;
let x: u8 = 13;
let y: u8 = 42;

let z = u8::conditional_select(&x, &y, 0.into());
assert_eq!(z, x);
let z = u8::conditional_select(&x, &y, 1.into());
assert_eq!(z, y);

Provided Methods§

Source

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Conditionally assign other to self, according to choice.

This function should execute in constant time.

§Example
use subtle::ConditionallySelectable;
let mut x: u8 = 13;
let mut y: u8 = 42;

x.conditional_assign(&y, 0.into());
assert_eq!(x, 13);
x.conditional_assign(&y, 1.into());
assert_eq!(x, 42);
Source

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Conditionally swap self and other if choice == 1; otherwise, reassign both unto themselves.

This function should execute in constant time.

§Example
use subtle::ConditionallySelectable;
let mut x: u8 = 13;
let mut y: u8 = 42;

u8::conditional_swap(&mut x, &mut y, 0.into());
assert_eq!(x, 13);
assert_eq!(y, 42);
u8::conditional_swap(&mut x, &mut y, 1.into());
assert_eq!(x, 42);
assert_eq!(y, 13);

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl ConditionallySelectable for Ordering

Ordering is #[repr(i8)] where:

  • Less => -1
  • Equal => 0
  • Greater => 1

Given this, it’s possible to operate on orderings as if they’re integers, which allows leveraging conditional masking for predication.

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

impl ConditionallySelectable for i8

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Source§

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Source§

impl ConditionallySelectable for i16

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Source§

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Source§

impl ConditionallySelectable for i32

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Source§

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Source§

impl ConditionallySelectable for i64

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Source§

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Source§

impl ConditionallySelectable for i128

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Source§

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Source§

impl ConditionallySelectable for u8

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Source§

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Source§

impl ConditionallySelectable for u16

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Source§

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Source§

impl ConditionallySelectable for u32

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Source§

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Source§

impl ConditionallySelectable for u64

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Source§

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Source§

impl ConditionallySelectable for u128

Source§

fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self

Source§

fn conditional_assign(&mut self, other: &Self, choice: Choice)

Source§

fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)

Implementors§