# Trait subtle::ConstantTimeEq

``````pub trait ConstantTimeEq {
// Required method
fn ct_eq(&self, other: &Self) -> Choice;
}``````
Expand description

An `Eq`-like trait that produces a `Choice` instead of a `bool`.

## §Example

``````use subtle::ConstantTimeEq;
let x: u8 = 5;
let y: u8 = 13;

assert_eq!(x.ct_eq(&y).unwrap_u8(), 0);
assert_eq!(x.ct_eq(&x).unwrap_u8(), 1);``````

## Required Methods§

source

#### fn ct_eq(&self, other: &Self) -> Choice

Determine if two items are equal.

The `ct_eq` function should execute in constant time.

##### §Returns
• `Choice(1u8)` if `self == other`;
• `Choice(0u8)` if `self != other`.

## Object Safety§

This trait is not object safe.

## Implementations on Foreign Types§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

### impl<T: ConstantTimeEq> ConstantTimeEq for [T]

source§

#### fn ct_eq(&self, _rhs: &[T]) -> Choice

Check whether two slices of `ConstantTimeEq` types are equal.

##### §Note

This function short-circuits if the lengths of the input slices are different. Otherwise, it should execute in time independent of the slice contents.

Since arrays coerce to slices, this function works with fixed-size arrays:

``````let a: [u8; 8] = [0,1,2,3,4,5,6,7];
let b: [u8; 8] = [0,1,2,3,0,1,2,3];

let a_eq_a = a.ct_eq(&a);
let a_eq_b = a.ct_eq(&b);

assert_eq!(a_eq_a.unwrap_u8(), 1);
assert_eq!(a_eq_b.unwrap_u8(), 0);``````

source§

source§