pub struct HotpConfig {
pub secret: ZeroizedString,
pub digits: u8,
pub algorithm: OtpAlgorithm,
pub counter: u64,
pub lookahead_window: u32,
pub attempt_count: u8,
pub max_attempts: u8,
}Expand description
HOTP factor configuration (RFC 4226).
Fields§
§secret: ZeroizedStringShared secret (raw bytes, base32-encoded for provisioning URIs). Zeroized on drop.
digits: u8Number of digits in the generated code (typically 6).
algorithm: OtpAlgorithmHMAC algorithm used for code derivation.
counter: u64Server-side counter; advances on every successful verification.
lookahead_window: u32Number of future counter values accepted to handle hardware-token drift.
attempt_count: u8Number of failed verification attempts made against the current
counter window. Incremented on each failed verify; reset to 0 on
successful verify. When attempt_count >= max_attempts, the
counter is advanced past the lookahead window so the current set
of codes can never be presented again, and the user must re-sync
from a fresh hardware-token press.
Required by RFC 4226 §7.4 (“the server MUST set a throttling parameter T”). Without this counter, an attacker has unlimited guesses against the lookahead window.
max_attempts: u8Maximum failed attempts before the counter is burned. RFC 4226 §7.4 RECOMMENDS T ≤ 10. Default: 5. Set to 0 to disable (not recommended).
Trait Implementations§
Source§impl Clone for HotpConfig
impl Clone for HotpConfig
Source§fn clone(&self) -> HotpConfig
fn clone(&self) -> HotpConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for HotpConfig
impl Debug for HotpConfig
Source§impl Default for HotpConfig
impl Default for HotpConfig
Source§fn default() -> HotpConfig
fn default() -> HotpConfig
Source§impl<'de> Deserialize<'de> for HotpConfig
impl<'de> Deserialize<'de> for HotpConfig
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<HotpConfig, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<HotpConfig, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Serialize for HotpConfig
impl Serialize for HotpConfig
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Auto Trait Implementations§
impl Freeze for HotpConfig
impl RefUnwindSafe for HotpConfig
impl Send for HotpConfig
impl Sync for HotpConfig
impl Unpin for HotpConfig
impl UnsafeUnpin for HotpConfig
impl UnwindSafe for HotpConfig
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.