Skip to main content

HandshakeServer

Struct HandshakeServer 

Source
pub struct HandshakeServer { /* private fields */ }
Expand description

Handshake Server State Machine

Holds the server’s long-lived signing key (via HybridSigningKey, which itself zeroes on drop) and a master secret from which the actually-used per-hour PoW/cookie secret is derived on each call (see derive_session_secret_for_hour). On drop the master is zeroed via the derived ZeroizeOnDrop.

Rotation (Phase 1.11): the master itself rotates only on process restart, but the derived hour-bucketed secret rotates every hour. Validation accepts the current hour and the immediately-previous hour, so a cookie or PoW solution captured at minute 59 of one hour is still honored at minute 5 of the next.

Implementations§

Source§

impl HandshakeServer

Source

pub fn new() -> Result<Self, HandshakeError>

Source

pub fn with_signing_key( signing_key: HybridSigningKey, ) -> Result<Self, HandshakeError>

Build a HandshakeServer from a caller-supplied long-lived HybridSigningKey (Phase 7.4 follow-up).

Used by embedders that persist the server’s signing key across restarts so client pinning material does not change on every boot. The verifying key is derived from the supplied signing key, the per-process master secret is freshly generated, and the remaining state (PoW counters, session cache) initializes the same way as Self::new.

The supplied signing_key is moved in and held under HandshakeServer’s ZeroizeOnDrop — the same memory-hygiene invariant as the auto-generated path.

Source

pub fn adaptive_difficulty(&self) -> u8

Recommended PoW difficulty for the current handshake load. Callers (e.g. PhantomListener::accept) pass this into process_client_hello so the cost imposed on each new client scales with server load.

Difficulty tiers (handshakes-per-minute → difficulty):

  <100         → 0   (no PoW)
  100..500     → 4   (~16 hash evaluations expected)
  500..2000    → 8   (~256 evaluations)
  2000..10000  → 12  (~4k evaluations)
  >=10000      → 16  (~64k evaluations)

These tiers err on the side of leniency: a healthy server doing a few hundred handshakes per minute imposes no PoW work on clients. Only at high load — where DoS protection matters most — does the cost ramp up.

Source

pub fn handshakes_this_minute(&self) -> u64

Current per-minute handshake count. Exposed for metrics (handshakes_per_minute).

Source

pub fn process_client_hello( &self, client_hello: &ClientHello, difficulty: u8, client_ip: IpAddr, ) -> HandshakeResponse

Source

pub fn verifying_key(&self) -> &HybridVerifyingKey

Source

pub fn session_cache_len(&self) -> usize

Number of tickets currently held in the resumption cache. Exposed for metrics / tests; not on the hot path. Phase 4.1.

Trait Implementations§

Source§

impl Drop for HandshakeServer

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CompatExt for T

Source§

fn compat(self) -> Compat<T>
where T: Sized,

Applies the Compat adapter by value. Read more
Source§

fn compat_ref(&self) -> Compat<&T>

Applies the Compat adapter by shared reference. Read more
Source§

fn compat_mut(&mut self) -> Compat<&mut T>

Applies the Compat adapter by mutable reference. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, UT> HandleAlloc<UT> for T
where T: Send + Sync,

Source§

fn new_handle(value: Arc<T>) -> Handle

Create a new handle for an Arc value Read more
Source§

unsafe fn clone_handle(handle: Handle) -> Handle

Clone a handle Read more
Source§

unsafe fn consume_handle(handle: Handle) -> Arc<T>

Consume a handle, getting back the initial Arc<> Read more
Source§

unsafe fn get_arc(handle: Handle) -> Arc<Self>

Get a clone of the Arc<> using a “borrowed” handle. Read more
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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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