Skip to main content

ConstantTimeOps

Struct ConstantTimeOps 

Source
pub struct ConstantTimeOps;
Expand description

Constant-time comparison utilities for security tokens Uses subtle crate to ensure comparisons take the same time regardless of where differences occur

Implementations§

Source§

impl ConstantTimeOps

Source

pub fn compare(expected: &[u8], actual: &[u8]) -> bool

Compare two byte slices in constant time

Returns true if equal, false otherwise. Time is independent of where the difference occurs, preventing timing attacks.

§Arguments
  • expected - The expected (correct/known) value
  • actual - The actual (untrusted) value from the user/attacker
§Examples
use fraiseql_auth::constant_time::ConstantTimeOps;
let stored_token = b"secret_token_value";
let user_token = b"user_provided_token";
assert!(!ConstantTimeOps::compare(stored_token, user_token));
Source

pub fn compare_str(expected: &str, actual: &str) -> bool

Compare two strings in constant time

Converts strings to bytes and performs constant-time comparison. Useful for comparing JWT tokens, session tokens, or other string-based secrets.

§Arguments
  • expected - The expected (correct/known) string value
  • actual - The actual (untrusted) string value from the user/attacker
Source

pub fn compare_len_safe(expected: &[u8], actual: &[u8]) -> bool

Compare two slices with different lengths in constant time

If lengths differ, still compares as much as possible to avoid leaking length information through timing.

§SECURITY WARNING

This function is vulnerable to timing attacks that measure comparison duration. For JWT tokens or other security-sensitive values, use compare_padded() instead which always compares at a fixed length to prevent length disclosure.

Source

pub fn compare_padded(expected: &[u8], actual: &[u8], fixed_len: usize) -> bool

Compare two byte slices at a fixed/padded length for timing attack prevention

Always compares at fixed_len bytes, padding with zeros if necessary. This prevents timing attacks that measure comparison duration to determine length.

§Arguments
  • expected - The expected (correct/known) value
  • actual - The actual (untrusted) value from the user/attacker
  • fixed_len - The fixed length to use for comparison (e.g., 512 for JWT tokens)
§SECURITY

Prevents length-based timing attacks. Time is independent of actual input lengths.

§Example
use fraiseql_auth::constant_time::ConstantTimeOps;
let stored_jwt = "eyJhbGc...";
let user_jwt = "eyJhbGc...";
// Always compares at 512 bytes, padding with zeros if needed
let result = ConstantTimeOps::compare_padded(
    stored_jwt.as_bytes(),
    user_jwt.as_bytes(),
    512
);
Source

pub fn compare_jwt_constant(expected: &str, actual: &str) -> bool

Compare JWT tokens in constant time with fixed-length padding

JWT tokens are typically 300-800 bytes. Using 512-byte fixed-length comparison prevents attackers from determining token length through timing analysis.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,