Skip to main content

Ed25519NtorCrossCert

Struct Ed25519NtorCrossCert 

Source
#[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
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional 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

Source

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
  1. MUST be of CertType::NTOR_CC_IDENTITY.
  2. Certified key MUST be of CertifiedKey::Ed25519.
  3. Certified key MUST be equal to id_ed25519.
  4. MUST have a valid signature.
Source

pub fn new_signed( ntor_ed25519: &ExpandedKeypair, id_ed25519: Ed25519Identity, expiry: SystemTime, ) -> StdResult<EmbeddedCert<Self, KeyUnknownCert>, Bug>

Creates a new signed Ed25519NtorCrossCert.

Source

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
  1. MUST be of CertType::NTOR_CC_IDENTITY.
  2. Certified key MUST be of CertifiedKey::Ed25519.
  3. 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.

Source

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

Source§

fn clone(&self) -> Ed25519NtorCrossCert

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Ed25519NtorCrossCert

Source§

impl Debug for Ed25519NtorCrossCert

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl EmbeddableCertObject<KeyUnknownCert> for Ed25519NtorCrossCert

Source§

const LABEL: &str = "ED25519 CERT"

The netdoc Object Label
Source§

impl Eq for Ed25519NtorCrossCert

Source§

impl PartialEq for Ed25519NtorCrossCert

Source§

fn eq(&self, other: &Ed25519NtorCrossCert) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for Ed25519NtorCrossCert

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
Source§

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

Source§

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

Source§

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

Source§

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
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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

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

Source§

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.
Source§

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.
Source§

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.
Source§

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.
Source§

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

Source§

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.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

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

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

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DynClone for T
where T: Clone,

Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
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> 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
Source§

impl<T> PossiblyOption<T> for T

Source§

fn to_option(self) -> Option<T>

Convert this object into an Option<T>
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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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.
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