Struct matrix_sdk::encryption::secret_storage::SecretStore

source ·
pub struct SecretStore { /* private fields */ }
Available on crate feature e2e-encryption only.
Expand description

Secure key/value storage for Matrix users.

The SecretStore struct encapsulates the secret storage mechanism for Matrix users, as it is specified in the Matrix specification.

This specialized storage is tied to the user’s Matrix account and serves as an encrypted key/value store, backed by account data residing on the homeserver. Any secrets uploaded to the homeserver using the SecretStore::put_secret() method are automatically encrypted by the SecretStore.

SecretStore enables you to safely manage and access sensitive information while ensuring that it remains protected from unauthorized access. It plays a crucial role in maintaining the privacy and security of a Matrix user’s data.

Data Flow Overview:

flowchart LR subgraph Client SecretStore end subgraph Homeserver data[Account Data] end SecretStore <== Encrypted ==> data

Note: It’s important to emphasize that the SecretStore should not be used for storing large volumes of data due to its nature as a key/value store for sensitive information.

§Examples

use ruma::events::secret::request::SecretName;

let secret_store = client
   .encryption()
   .secret_storage()
   .open_secret_store("It's a secret to everybody")
   .await?;

let my_secret = "Top secret secret";
let my_secret_name = SecretName::from("m.treasure");

secret_store.put_secret(my_secret_name, my_secret);

Implementations§

source§

impl SecretStore

source

pub fn secret_storage_key(&self) -> String

Export the SecretStorageKey of this SecretStore as a base58-encoded string as defined in the spec.

Note: This returns a copy of the private key material of the SecretStorageKey as a string. The caller needs to ensure that this string is zeroized.

source

pub async fn get_secret( &self, secret_name: impl Into<SecretName>, ) -> Result<Option<String>>

Retrieve a secret from the homeserver’s account data

This method allows you to retrieve a secret from the account data stored on the Matrix homeserver.

§Arguments
  • secret_name: The name of the secret. The provided secret_name serves as the event type for the associated account data event.

The retrieve_secret method enables you to access and decrypt secrets previously stored in the user’s account data on the homeserver. You can use the secret_name parameter to specify the desired secret to retrieve.

§Examples
use ruma::events::secret::request::SecretName;

let secret_store = client
    .encryption()
    .secret_storage()
    .open_secret_store("It's a secret to everybody")
    .await?;

let my_secret_name = SecretName::from("m.treasure");

let secret = secret_store.get_secret(my_secret_name).await?;
source

pub async fn put_secret( &self, secret_name: impl Into<SecretName>, secret: &str, ) -> Result<()>

Store a secret in the homeserver’s account data

This method allows you to securely store a secret on the Matrix homeserver as an encrypted account data event.

§Arguments
  • secret_name: The name of the secret. The provided secret_name serves as the event type for the account data event on the homeserver.

  • secret: The secret to be stored on the homeserver. The secret is encrypted before being stored, ensuring its confidentiality and integrity.

§Examples
use ruma::events::secret::request::SecretName;

let secret_store = client
    .encryption()
    .secret_storage()
    .open_secret_store("It's a secret to everybody")
    .await?;

let my_secret = "Top secret secret";
let my_secret_name = SecretName::from("m.treasure");

secret_store.put_secret(my_secret_name, my_secret);
source

pub async fn import_secrets(&self) -> Result<()>

Retrieve and store well-known secrets locally

This method retrieves and stores all well-known secrets from the account data on the Matrix homeserver to enhance local security and identity verification.

The following secrets are retrieved by this method:

  • m.cross_signing.master: The master cross-signing key.
  • m.cross_signing.self_signing: The self-signing cross-signing key.
  • m.cross_signing.user_signing: The user-signing cross-signing key.
  • m.megolm_backup.v1: The backup recovery key.

If the m.cross_signing.self_signing key is successfully imported, it is used to sign our own Device, marking it as verified. This step is establishes trust in your own device’s identity.

By invoking this method, you ensure that your device has access to the necessary secrets for device and identity verification.

§Examples
use ruma::events::secret::request::SecretName;

let secret_store = client
    .encryption()
    .secret_storage()
    .open_secret_store("It's a secret to everybody")
    .await?;

secret_store.import_secrets().await?;

let status = client
    .encryption()
    .cross_signing_status()
    .await
    .expect("We should be able to check out cross-signing status");

println!("Cross-signing status {status:?}");

Trait Implementations§

source§

impl Debug for SecretStore

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

impl<T> CompatExt for T

§

fn compat(self) -> Compat<T>

Applies the [Compat] adapter by value. Read more
§

fn compat_ref(&self) -> Compat<&T>

Applies the [Compat] adapter by shared reference. Read more
§

fn compat_mut(&mut self) -> Compat<&mut T>

Applies the [Compat] adapter by mutable reference. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FutureExt for T

source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
source§

impl<T, UT> HandleAlloc<UT> for T
where T: Send + Sync,

source§

fn new_handle(value: Arc<T>) -> Handle

Create a new handle for an Arc value Read more
source§

fn clone_handle(handle: Handle) -> Handle

Clone a handle Read more
source§

fn consume_handle(handle: Handle) -> Arc<T>

Consume a handle, getting back the initial Arc<>
source§

fn get_arc(handle: Handle) -> Arc<Self>

Get a clone of the Arc<> using a “borrowed” handle. Read more
source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

source§

const WITNESS: W = W::MAKE

A constant of the type witness
source§

impl<T> Identity for T
where T: ?Sized,

§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

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

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

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

§

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

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
source§

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

source§

impl<T> AsyncTraitDeps for T

source§

impl<T> SendOutsideWasm for T
where T: Send,

source§

impl<T> SyncOutsideWasm for T
where T: Sync,