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);

Object Safety§

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 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)

Implementors§