pub struct CtOption<T> { /* private fields */ }
Expand description
The CtOption<T>
type represents an optional value similar to the
Option<T>
type but is intended for
use in constant time APIs.
Any given CtOption<T>
is either Some
or None
, but unlike
Option<T>
these variants are not exposed. The
is_some()
method is used to determine if
the value is Some
, and unwrap_or()
and
unwrap_or_else()
methods are
provided to access the underlying value. The value can also be
obtained with unwrap()
but this will panic
if it is None
.
Functions that are intended to be constant time may not produce
valid results for all inputs, such as square root and inversion
operations in finite field arithmetic. Returning an Option<T>
from these functions makes it difficult for the caller to reason
about the result in constant time, and returning an incorrect
value burdens the caller and increases the chance of bugs.
Implementations§
source§impl<T> CtOption<T>
impl<T> CtOption<T>
sourcepub fn new(value: T, is_some: Choice) -> CtOption<T>
pub fn new(value: T, is_some: Choice) -> CtOption<T>
This method is used to construct a new CtOption<T>
and takes
a value of type T
, and a Choice
that determines whether
the optional value should be Some
or not. If is_some
is
false, the value will still be stored but its value is never
exposed.
sourcepub fn expect(self, msg: &str) -> T
pub fn expect(self, msg: &str) -> T
Returns the contained value, consuming the self
value.
§Panics
Panics if the value is none with a custom panic message provided by
msg
.
sourcepub fn unwrap_or(self, def: T) -> Twhere
T: ConditionallySelectable,
pub fn unwrap_or(self, def: T) -> Twhere
T: ConditionallySelectable,
This returns the underlying value if it is Some
or the provided value otherwise.
sourcepub fn unwrap_or_else<F>(self, f: F) -> Twhere
T: ConditionallySelectable,
F: FnOnce() -> T,
pub fn unwrap_or_else<F>(self, f: F) -> Twhere
T: ConditionallySelectable,
F: FnOnce() -> T,
This returns the underlying value if it is Some
or the value produced by the provided closure otherwise.
This operates in constant time, because the provided closure is always called.
sourcepub fn map<U, F>(self, f: F) -> CtOption<U>
pub fn map<U, F>(self, f: F) -> CtOption<U>
Returns a None
value if the option is None
, otherwise
returns a CtOption
enclosing the value of the provided closure.
The closure is given the enclosed value or, if the option is
None
, it is provided a dummy value computed using
Default::default()
.
This operates in constant time, because the provided closure is always called.
sourcepub fn and_then<U, F>(self, f: F) -> CtOption<U>
pub fn and_then<U, F>(self, f: F) -> CtOption<U>
Returns a None
value if the option is None
, otherwise
returns the result of the provided closure. The closure is
given the enclosed value or, if the option is None
, it
is provided a dummy value computed using Default::default()
.
This operates in constant time, because the provided closure is always called.
sourcepub fn or_else<F>(self, f: F) -> CtOption<T>
pub fn or_else<F>(self, f: F) -> CtOption<T>
Returns self
if it contains a value, and otherwise returns the result of
calling f
. The provided function f
is always called.
sourcepub fn into_option(self) -> Option<T>
pub fn into_option(self) -> Option<T>
Convert the CtOption<T>
wrapper into an Option<T>
, depending on whether
the underlying is_some
Choice
was a 0
or a 1
once unwrapped.
§Note
This function exists to avoid ending up with ugly, verbose and/or bad handled
conversions from the CtOption<T>
wraps to an Option<T>
or Result<T, E>
.
This implementation doesn’t intend to be constant-time nor try to protect the
leakage of the T
since the Option<T>
will do it anyways.
It’s equivalent to the corresponding From
impl, however this version is
friendlier for type inference.
Trait Implementations§
source§impl<T: ConditionallySelectable> ConditionallySelectable for CtOption<T>
impl<T: ConditionallySelectable> ConditionallySelectable for CtOption<T>
source§fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self
fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self
source§fn conditional_assign(&mut self, other: &Self, choice: Choice)
fn conditional_assign(&mut self, other: &Self, choice: Choice)
source§fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
self
and other
if choice == 1
; otherwise,
reassign both unto themselves. Read moresource§impl<T: ConstantTimeEq> ConstantTimeEq for CtOption<T>
impl<T: ConstantTimeEq> ConstantTimeEq for CtOption<T>
source§impl<T> From<CtOption<T>> for Option<T>
impl<T> From<CtOption<T>> for Option<T>
source§fn from(source: CtOption<T>) -> Option<T>
fn from(source: CtOption<T>) -> Option<T>
Convert the CtOption<T>
wrapper into an Option<T>
, depending on whether
the underlying is_some
Choice
was a 0
or a 1
once unwrapped.
§Note
This function exists to avoid ending up with ugly, verbose and/or bad handled
conversions from the CtOption<T>
wraps to an Option<T>
or Result<T, E>
.
This implementation doesn’t intend to be constant-time nor try to protect the
leakage of the T
since the Option<T>
will do it anyways.
impl<T: Copy> Copy for CtOption<T>
Auto Trait Implementations§
impl<T> Freeze for CtOption<T>where
T: Freeze,
impl<T> RefUnwindSafe for CtOption<T>where
T: RefUnwindSafe,
impl<T> Send for CtOption<T>where
T: Send,
impl<T> Sync for CtOption<T>where
T: Sync,
impl<T> Unpin for CtOption<T>where
T: Unpin,
impl<T> UnwindSafe for CtOption<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)