Skip to main content

TlsKeyAndCert

Struct TlsKeyAndCert 

Source
#[non_exhaustive]
pub struct TlsKeyAndCert { pub(crate) certificates: Vec<Vec<u8>>, pub(crate) private_key: RsaPrivateKey, pub(crate) sha256_digest: [u8; 32], pub(crate) expiration: SystemTime, }
Expand description

A set of x.509 certificate information and keys for use with a TLS library.

Only relays need this: They should set these as the certificate(s) to be used for incoming TLS connections.

This is not necessarily the most convenient form to manipulate certificates in: rather, it is intended to provide the formats that TLS libraries generally expect to get.

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.
§certificates: Vec<Vec<u8>>

A list of certificates in DER form.

(This may contain more than one certificate, but for now only one certificate is used.)

§private_key: RsaPrivateKey

A private key for use in the TLS handshake.

§sha256_digest: [u8; 32]

A SHA256 digest of the link certificate (the one certifying the private key’s public component).

This digest is the one what will be certified by the relay’s SIGNING_V_TLS_CERT certificate.

§expiration: SystemTime

A time after which this set of link information won’t be valid, and another should be generated.

Implementations§

Source§

impl TlsKeyAndCert

Source

pub fn certificates_der(&self) -> Vec<&[u8]>

Return the certificates as a list of DER-encoded values.

Source

pub fn certificate_pem(&self) -> String

Return the certificates as a concatenated list in PEM (“BEGIN CERTIFICATE”) format.

Source

pub fn private_key_pkcs8_der(&self) -> Result<Zeroizing<Vec<u8>>, X509CertError>

Return the private key in (unencrypted) PKCS8 DER format.

Source

pub fn private_key_pkcs8_pem(&self) -> Result<Zeroizing<String>, X509CertError>

Return the private key in (unencrypted) PKCS8 PEM (“BEGIN PRIVATE KEY”) format.

Source

pub fn expiration(&self) -> SystemTime

Return the earliest time at which any of these certificates will expire.

Return the SHA256 digest of the link certificate

This digest is the one certified with the relay’s SIGNING_V_TLS_CERT certificate.

Source

pub fn create<Rng: CryptoRng>( rng: &mut Rng, now: SystemTime, issuer_hostname: &str, subject_hostname: &str, ) -> Result<Self, X509CertError>

Create a new TLS link key and associated certificate(s).

The certificate will be valid at now, and for a while after.

The certificate parameters and keys are chosen for reasonable security, approximate conformance to RFC5280, and limited fingerprinting resistance.

Note: The fingerprinting resistance is quite limited. We will likely want to pursue these avenues for better fingerprinting resistance:

  • Encourage more use of TLS 1.3, where server certificates are encrypted. (This prevents passive fingerprinting only.)
  • Adjust this function to make certificates look even more normal
  • Integrate with ACME-supporting certificate issuers (Letsencrypt, etc) to get real certificates for Tor relays.

Trait Implementations§

Source§

impl Clone for TlsKeyAndCert

Source§

fn clone(&self) -> TlsKeyAndCert

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 Debug for TlsKeyAndCert

Source§

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

Formats the value using the given formatter. Read more

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