#[non_exhaustive]pub struct Ed25519NtorCrossCert {
_promise_we_verified: (),
}Expand description
Verified reverse cert by K_ntor on KP_relayid_ed
This certificate is signed by KS_ntor (the circuit extension key) and certifies KP_relayid_ed25519 ed25519 identity key of the relay.
The type itself is zero-sized because it provides no new useful
information that cannot be found elsewhere within the router descriptor.
It is intended for use within
EmbeddedCert<Ed25519NtorCrossCert, KeyUnknownCert>
§Note on key conversion
Keep in mind however that the ntor onion key is only provided as an
X25519 key and not an Ed25519 key, meaning that interfacing
applications have to convert it using a function such as
tor_llcrypto::pk::keymanip::convert_curve25519_to_ed25519_public().
This also requires obtaining the sign bit which is usually given as an
argument in the ntor-onion-key-crosscert item. However, this is
outside of the scope of this struct and the code will assume that
callers have already converted the X25519 public key to an Ed25519
public key as outlined in the specifications.
§See Also
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work._promise_we_verified: ()Explicit field, to avoid constructing this accidentally without doing all the verification.
Implementations§
Source§impl Ed25519NtorCrossCert
impl Ed25519NtorCrossCert
Sourcepub fn verify(
ntor_ed25519: Ed25519Identity,
id_ed25519: Ed25519Identity,
cert: KeyUnknownCert,
) -> StdResult<TimerangeBound<Self>, VerifyFailed>
pub fn verify( ntor_ed25519: Ed25519Identity, id_ed25519: Ed25519Identity, cert: KeyUnknownCert, ) -> StdResult<TimerangeBound<Self>, VerifyFailed>
Verifies the validity of an Ed25519NtorCrossCert.
For such a certificate to be valid, the caller must provide a known Ed25519 identity key and Ed25519 ntor onion key of the relay beforehand.
§Requirements
- MUST be of
CertType::NTOR_CC_IDENTITY. - Certified key MUST be of
CertifiedKey::Ed25519. - Certified key MUST be equal to
id_ed25519. - MUST have a valid signature.
Sourcepub fn new_signed(
ntor_ed25519: &ExpandedKeypair,
id_ed25519: Ed25519Identity,
expiry: SystemTime,
) -> StdResult<EmbeddedCert<Self, KeyUnknownCert>, Bug>
pub fn new_signed( ntor_ed25519: &ExpandedKeypair, id_ed25519: Ed25519Identity, expiry: SystemTime, ) -> StdResult<EmbeddedCert<Self, KeyUnknownCert>, Bug>
Creates a new signed Ed25519NtorCrossCert.
Sourcepub(crate) fn verify_inner(
ntor_ed25519: Ed25519Identity,
id_ed25519: Ed25519Identity,
cert: KeyUnknownCert,
) -> StdResult<(SignatureGated<TimerangeBound<Self>>, ValidatableEd25519Signature, SystemTime), VerifyFailed>
pub(crate) fn verify_inner( ntor_ed25519: Ed25519Identity, id_ed25519: Ed25519Identity, cert: KeyUnknownCert, ) -> StdResult<(SignatureGated<TimerangeBound<Self>>, ValidatableEd25519Signature, SystemTime), VerifyFailed>
Verifies the validity of a KeyUnknownCert believed to be a
CertType::NTOR_CC_IDENTITY.
This function serves as glue between the legacy parser and
Self::verify().
§Requirements
- MUST be of
CertType::NTOR_CC_IDENTITY. - Certified key MUST be of
CertifiedKey::Ed25519. - Certified key MUST be equal to
id_ed25519.
§Return Type
Actual signature and time validation is done by the caller, hence
why it returns a gated type as the first element of the tuple.
The other elements constitute the inner signature plus the
SystemTime denoting the expiry. This is required for integration
with legacy parser in order to enable pushing it to the verification
batch, as the tor_checkable primitives do not provide access
to the inner signatures/expiries and also do not support operations
like cloning due to being dyn.
Sourcepub(crate) fn dangerous_new_unverified() -> Self
pub(crate) fn dangerous_new_unverified() -> Self
Internal function for creating an unverified instance.
This is only intended for testing and legacy parser compatibility purposes.
Trait Implementations§
Source§impl Clone for Ed25519NtorCrossCert
impl Clone for Ed25519NtorCrossCert
Source§fn clone(&self) -> Ed25519NtorCrossCert
fn clone(&self) -> Ed25519NtorCrossCert
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for Ed25519NtorCrossCert
Source§impl Debug for Ed25519NtorCrossCert
impl Debug for Ed25519NtorCrossCert
impl Eq for Ed25519NtorCrossCert
Source§impl PartialEq for Ed25519NtorCrossCert
impl PartialEq for Ed25519NtorCrossCert
Source§fn eq(&self, other: &Ed25519NtorCrossCert) -> bool
fn eq(&self, other: &Ed25519NtorCrossCert) -> bool
self and other values to be equal, and is used by ==.impl StructuralPartialEq for Ed25519NtorCrossCert
Auto Trait Implementations§
impl Freeze for Ed25519NtorCrossCert
impl RefUnwindSafe for Ed25519NtorCrossCert
impl Send for Ed25519NtorCrossCert
impl Sync for Ed25519NtorCrossCert
impl Unpin for Ed25519NtorCrossCert
impl UnsafeUnpin for Ed25519NtorCrossCert
impl UnwindSafe for Ed25519NtorCrossCert
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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>
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