gosling::context

Struct Context

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

The gosling protocol implementation.

The Context object provides various methods for starting and progressing identity and endpoint handshakes. The general usage pattern developers will follow is to construct a Context object, connect to the Tor Network using Context::bootstrap(), optionally start an identity or endpoint servers, and listen for and handle incoming identity and endpoint clients using Context::update() and the various associated methods. Depending on the application’s requirements, the developer can also initiate identity and endpoint handshakes as necessary.

The Gosling Protocol specification can be found here:

Implementations§

Source§

impl Context

Source

pub fn new( tor_provider: Box<dyn TorProvider>, identity_port: u16, endpoint_port: u16, identity_timeout: Duration, identity_max_message_size: i32, endpoint_timeout: Option<Duration>, identity_private_key: Ed25519PrivateKey, ) -> Result<Self, Error>

Construct a new Context object.

§Parameters
  • tor_provider: an implementation of the TorProvider trait which provides our Tor Network connectivity
  • identity_port: the virt-port this Context’s identity server’s onion-service will listen on for new identity handshakes.
  • endpoint_port: the virt-port this Context‘s endpoint servers’ onion-services will listen on for new endpoint handshakes.
  • identity_timeout: the maximum amount of time this Context’ will allow an identity handshake to delay between steps before rejecting the request.
  • identity_max_message_size: the maximum size of the underlying Honk-RPC BSON message this Context’s identity handshake will send and accept.
  • endpoint_timeout: the maximum amount of time this Context’ will allow an endpoint handshake to delay between steps before rejecting the request.
  • identity_private_key: the ed25519 private key used to start this Context’s identity server’s onion-service
§Returns

A newly constructed Context.

Source

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

Initiate bootstrap of the Context’s owned TorProvider. Bootstrap status is communicated through ContextEvents returned from the Context::update() method.

Source

pub fn identity_client_begin_handshake( &mut self, identity_server_id: V3OnionServiceId, endpoint: String, ) -> Result<HandshakeHandle, Error>

Initiate an identity handshake with an identity server. Handshake progression is communicated through ContextEvents returned from the Context::update() method.

§Parameters
  • identitity_server_id: the long term identity onion-service service-id of a remote peer
  • endpoint: the ASCII-encoded requested endpoint
§Returns

A HandshakeHandle used to refer to this particular identity handshake.

Source

pub fn identity_client_abort_handshake( &mut self, handle: HandshakeHandle, ) -> Result<(), Error>

Abort an in-process outgoing identity handshake.

§Parameters
  • handle: the handle of the in-progress outoing identity handshake to abort
Source

pub fn identity_client_handle_challenge_received( &mut self, handle: HandshakeHandle, challenge_response: Document, ) -> Result<(), Error>

Handle an identity server’s endpoint challenge. Callers must construct an identity client’s endpoint challenge-response. The particulars of creating and verifying the challenge-response BSON documents are undefined and application-specific.

§Parameters
  • handle: the handle of the in-progress outgoing identity handshake
  • challenge_response: an application-specific BSON document which somehow responds to an identity server’s challenge.
Source

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

Start this Context’s identity server. Publish status is communicated through ContextEvents returned from the Context::update() method.

Source

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

Stops this Context’s identity server and ends any in-progress incoming identity handshakes.

Source

pub fn identity_server_handle_endpoint_request_received( &mut self, handle: HandshakeHandle, client_allowed: bool, endpoint_supported: bool, endpoint_challenge: Document, ) -> Result<(), Error>

Handle an identity client’s incoming endpoint request. Callers must determine whether the connected identity client is allowed to access the requested endpoint, decide whether the requested endpoint is supported by this Context, and build an endpoint challenge for the identity client. The particulars of creating the endpoint challenge is undefined and application-specific.

§Parameters
  • handle: the handle of the in-progress incoming identity handshake
  • client_allowed: whether the connected identity client is allowed to access the requested endpoint
  • endpoint_supported: whether the requested endpoint is supported
  • endpoint_challenge: an application-specific BSON document which the connected identity client must respond to
Source

pub fn identity_server_handle_challenge_response_received( &mut self, handle: HandshakeHandle, challenge_response_valid: bool, ) -> Result<(), Error>

Handle an identity client’s incoming endpoint challenge-response. Callers must determine whether the connected identity client’s challenge-response is valid. The particulars of verifying the challenge-response is undefined and application-specific.

§Parameters
  • handle: the handle of the in-progress incoming identity handshake
  • challenge_response_valid: whether the received challenge-response is valid
Source

pub fn endpoint_client_begin_handshake( &mut self, endpoint_server_id: V3OnionServiceId, client_auth_key: X25519PrivateKey, channel: String, ) -> Result<HandshakeHandle, Error>

Initiate an endpoint handshake with an identity server. An endpoint client acquires the endpoint_server_id and client_auth_key by completing an identity handshake or through some other side-channnel. Handshake progression is communicated through ContextEvents returned from the Context::update() method.

§Parameters
  • endpoint_server_id: the endpoint onion-service service-id of a remote peer
  • client_uath_key: the x25519 private-key required to decrypt the endpoint server’s onion-service descriptor
  • channel: the ASCII-encoded requested channel
Source

pub fn endpoint_client_abort_handshake( &mut self, handle: HandshakeHandle, ) -> Result<(), Error>

Abort an in-process outgoing endpoint handshake

§Parameters
  • handle: the handle of the in-progress outoing identity handshake to abort
Source

pub fn endpoint_server_start( &mut self, endpoint_private_key: Ed25519PrivateKey, endpoint_name: String, client_identity: V3OnionServiceId, client_auth: X25519PublicKey, ) -> Result<(), Error>

Start one of this Context’s endpoint servers. Publish status is communicated through ContextEvents returned from the Context::update() method.

§Parameters
  • endpoint_private_key: the ed25519 private key used to start this endpoint server’s onion-service
  • endpoint_name: the ASCII-encoded endpoint name
  • client_identity: the onion-service service-id of the client which will be connecting to this endpoint server
  • client_auth: the x25519 public-key used to encrypt the endpoint server’s onion-service descriptor
Source

pub fn endpoint_server_handle_channel_request_received( &mut self, handle: HandshakeHandle, channel_supported: bool, ) -> Result<(), Error>

Handle an endpoint client’s incoming channel request. Callers must determine whether the requested channel is supported by this Context. The particulars of making this determination is undefined and application-specific.

§Parameters
  • handle: the handle of the in-progress incoming endpoint handshake
  • channel_supported: whether the requested channel is supported
Source

pub fn endpoint_server_stop( &mut self, endpoint_identity: V3OnionServiceId, ) -> Result<(), Error>

Stop one of this Context’s endpoint servers and ends any of its in-progress incoming endpoint handshakes.

§Parameters
  • endpoint_identity: the onion-service service-id of the enpdoint server to stop
Source

pub fn connect( &mut self, target_addr: TargetAddr, circuit_token: Option<CircuitToken>, ) -> Result<OnionStream, Error>

A direct pass-through to the underlying TorProvider’s TorProvider::connect() method.

Source

pub fn generate_circuit_token(&mut self) -> CircuitToken

A direct pass-through to the underlying TorProvider’s TorProvider::generate_token() method.

Source

pub fn release_circuit_token(&mut self, circuit_token: CircuitToken)

A direct pass-through to the underlying TorProvider’s TorProvider::release_token() method.

Source

pub fn update(&mut self) -> Result<VecDeque<ContextEvent>, Error>

This function updates the Context’s underlying TorProvider, handles new handshakes requests, and updates in-progress handshakes. This function needs to be regularly called to process the returned ContextEvents.

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
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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
§

impl<Source, Target> OctetsInto<Target> for Source
where Target: OctetsFrom<Source>,

§

type Error = <Target as OctetsFrom<Source>>::Error

§

fn try_octets_into( self, ) -> Result<Target, <Source as OctetsInto<Target>>::Error>

Performs the conversion.
§

fn octets_into(self) -> Target
where Self::Error: Into<Infallible>,

Performs an infallible conversion.
§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeSendSync for T