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 hopr_crypto_types::prelude::{Keypair, OffchainKeypair};
use hopr_network_types::prelude::{IpOrHost, SealedHost};
use libp2p_identity::PeerId;
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§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§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,
§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> 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 more§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> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§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.§impl<T> ToStringFallible for Twhere
T: Display,
impl<T> ToStringFallible for Twhere
T: Display,
§fn try_to_string(&self) -> Result<String, TryReserveError>
fn try_to_string(&self) -> Result<String, TryReserveError>
ToString::to_string, but without panic on OOM.