Skip to main content

Client

Struct Client 

Source
pub struct Client<R: Read, W: Write> { /* private fields */ }
Expand description

Client side of the wire, an encrypted transport for issuing protobuf requests to a connected server. It initiates sessions by signaling a transport reset and driving the handshake, afterward encrypting outbound and decrypting inbound messages.

An empty frame from the server means it has no session with the client anymore. It surfaces as Error::SessionReset with the client’s session dropped too, so the caller can handshake again instead of waiting on a dead session.

The device attestation presented in the handshake is not interpreted by the wire, it is handed to a Verifier deciding whether to trust the server.

Implementations§

Source§

impl<R: Read, W: Write> Client<R, W>

Source

pub fn new(reader: R, writer: W) -> Self

Creates a new client side around a low level reader and writer. Reads block per the transport’s semantics, so a timeout for an unresponsive server must be configured on the reader passed in.

Source

pub fn handshake<V: Verifier>(&mut self, verifier: &V) -> Result<V::Info, Error>

Sends a session reset and drives the encrypted handshake with the server:

  1. Client -> Server: HostHello { host_signer, host_crypto } (plain CBOR)
  2. Server -> Client: ArkHello { ark_attest, ark_crypto, a2h_encap } (cose::seal)
  3. Client -> Server: HostAck { h2a_encap } (cose::seal)

The verifier receives the raw device attestation from the server’s hello and its accepted info is returned once the session is established.

Source

pub fn next_message(&mut self) -> Result<ArkToHost, Error>

Reads the next ark-to-host message, decrypting and protobuf decoding it. A frame that cannot be decoded or a packet that cannot be decrypted drops the session, as the server’s HPKE sequence can no longer be followed. So does an empty frame, the server signaling it dropped the session on its end. Only a fresh handshake recovers from either.

Source

pub fn send_message(&mut self, req: HostToArk) -> Result<(), Error>

Protobuf encodes a host-to-ark message, seals it with the session and sends it. Fails without an active session, and a failure after sealing drops the session, as the server’s HPKE sequence can no longer be caught up with.

Auto Trait Implementations§

§

impl<R, W> Freeze for Client<R, W>
where Framing<R, W>: Freeze,

§

impl<R, W> RefUnwindSafe for Client<R, W>
where Framing<R, W>: RefUnwindSafe,

§

impl<R, W> Send for Client<R, W>
where Framing<R, W>: Send,

§

impl<R, W> Sync for Client<R, W>
where Framing<R, W>: Sync,

§

impl<R, W> Unpin for Client<R, W>
where Framing<R, W>: Unpin,

§

impl<R, W> UnsafeUnpin for Client<R, W>
where Framing<R, W>: UnsafeUnpin,

§

impl<R, W> UnwindSafe for Client<R, W>
where Framing<R, W>: UnwindSafe,

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> 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> 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 = !

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

fn try_from(value: U) -> Result<T, !>

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