pub enum SealedHost {
Plain(IpOrHost),
Sealed(Box<[u8]>),
}
Expand description
Contains optionally encrypted IpOrHost
.
This is useful for hiding the IpOrHost
instance from the Entry node.
The client first encrypts the IpOrHost
instance via SealedHost::seal
using
the Exit node’s public key.
Upon receiving the SealedHost
instance by the Exit node, it can call
SealedHost::unseal
using its private key to get the original IpOrHost
instance.
Sealing is fully randomized and therefore does not leak information about equal IpOrHost
instances.
The length of the encrypted host is also obscured by the use of random padding before encryption.
§Example
use libp2p_identity::PeerId;
use hopr_crypto_types::prelude::{Keypair, OffchainKeypair};
use hopr_network_types::prelude::{IpOrHost, SealedHost};
let keypair = OffchainKeypair::random();
let exit_node_peer_id: PeerId = keypair.public().into();
let host: IpOrHost = "127.0.0.1:1000".parse()?;
// On the Client
let encrypted = SealedHost::seal(host.clone(), keypair.public().into())?;
// On the Exit node
let decrypted = encrypted.unseal(&keypair)?;
assert_eq!(host, decrypted);
// Plain SealedHost unseals trivially
let plain_sealed: SealedHost = host.clone().into();
assert_eq!(host, plain_sealed.try_into()?);
// The same host sealing is randomized
let encrypted_1 = SealedHost::seal(host.clone(), keypair.public().into())?;
let encrypted_2 = SealedHost::seal(host.clone(), keypair.public().into())?;
assert_ne!(encrypted_1, encrypted_2);
Variants§
Implementations§
Source§impl SealedHost
impl SealedHost
pub fn try_as_plain(self) -> Option<IpOrHost>
pub const fn try_as_plain_ref(&self) -> Option<&IpOrHost>
pub fn try_as_plain_mut(&mut self) -> Option<&mut IpOrHost>
pub fn try_as_sealed(self) -> Option<Box<[u8]>>
pub const fn try_as_sealed_ref(&self) -> Option<&Box<[u8]>>
pub fn try_as_sealed_mut(&mut self) -> Option<&mut Box<[u8]>>
Source§impl SealedHost
impl SealedHost
Sourcepub const PADDING_CHAR: char = '@'
pub const PADDING_CHAR: char = '@'
Character that can be appended to the host to obscure its length.
User can add as many of this character to the host, and it will be removed during unsealing.
Sourcepub fn seal(
host: IpOrHost,
peer_id: PeerId,
) -> Result<SealedHost, NetworkTypeError>
pub fn seal( host: IpOrHost, peer_id: PeerId, ) -> Result<SealedHost, NetworkTypeError>
Seals the given IpOrHost
using the Exit node’s peer ID.
Sourcepub fn unseal(self, key: &OffchainKeypair) -> Result<IpOrHost, NetworkTypeError>
pub fn unseal(self, key: &OffchainKeypair) -> Result<IpOrHost, NetworkTypeError>
Tries to unseal the sealed IpOrHost
using the private key as Exit node.
No-op, if the data is already unsealed.
Trait Implementations§
Source§impl Clone for SealedHost
impl Clone for SealedHost
Source§fn clone(&self) -> SealedHost
fn clone(&self) -> SealedHost
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for SealedHost
impl Debug for SealedHost
Source§impl<'de> Deserialize<'de> for SealedHost
impl<'de> Deserialize<'de> for SealedHost
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<SealedHost, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<SealedHost, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Display for SealedHost
impl Display for SealedHost
Source§impl From<IpOrHost> for SealedHost
impl From<IpOrHost> for SealedHost
Source§fn from(value: IpOrHost) -> SealedHost
fn from(value: IpOrHost) -> SealedHost
Source§impl Hash for SealedHost
impl Hash for SealedHost
Source§impl PartialEq for SealedHost
impl PartialEq for SealedHost
Source§impl Serialize for SealedHost
impl Serialize for SealedHost
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,
Source§impl TryFrom<SealedHost> for IpOrHost
impl TryFrom<SealedHost> for IpOrHost
Source§type Error = NetworkTypeError
type Error = NetworkTypeError
Source§fn try_from(
value: SealedHost,
) -> Result<IpOrHost, <IpOrHost as TryFrom<SealedHost>>::Error>
fn try_from( value: SealedHost, ) -> Result<IpOrHost, <IpOrHost as TryFrom<SealedHost>>::Error>
impl Eq for SealedHost
impl StructuralPartialEq for SealedHost
Auto Trait Implementations§
impl Freeze for SealedHost
impl RefUnwindSafe for SealedHost
impl Send for SealedHost
impl Sync for SealedHost
impl Unpin for SealedHost
impl UnwindSafe for SealedHost
Blanket Implementations§
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,
§impl<T> Conv for T
impl<T> Conv for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
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) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
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
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.