Skip to content

Commit

Permalink
WIP Rework the crypto crate README
Browse files Browse the repository at this point in the history
  • Loading branch information
poljar committed Jul 28, 2023
1 parent a3b9b1c commit e5f4cf6
Showing 1 changed file with 30 additions and 55 deletions.
85 changes: 30 additions & 55 deletions crates/matrix-sdk-crypto/README.md
Original file line number Diff line number Diff line change
@@ -1,71 +1,46 @@
A no-network-IO implementation of a state machine that handles E2EE for
[Matrix] clients.

# Usage
A no-network-IO implementation of a state machine that handles end-to-end
encryption for [Matrix] clients.

If you're just trying to write a Matrix client or bot in Rust, you're probably
looking for [matrix-sdk] instead.

However, if you're looking to add E2EE to an existing Matrix client or library,
read on.

The state machine works in a push/pull manner:

- you push state changes and events retrieved from a Matrix homeserver /sync
response into the state machine
- you pull requests that you'll need to send back to the homeserver out of the
state machine

```rust,no_run
use std::collections::BTreeMap;
use matrix_sdk_crypto::{OlmMachine, OlmError};
use ruma::{
api::client::sync::sync_events::{v3::ToDevice, DeviceLists},
device_id, user_id,
};
#[tokio::main]
async fn main() -> Result<(), OlmError> {
let alice = user_id!("@alice:example.org");
let machine = OlmMachine::new(&alice, device_id!("DEVICEID")).await;
let changed_devices = DeviceLists::default();
let one_time_key_counts = BTreeMap::default();
let unused_fallback_keys = Some(Vec::new());
// Push changes that the server sent to us in a sync response.
let decrypted_to_device = machine.receive_sync_changes(
vec![],
&changed_devices,
&one_time_key_counts,
unused_fallback_keys.as_deref(),
).await?;
// Pull requests that we need to send out.
let outgoing_requests = machine.outgoing_requests().await?;
However, if you're looking to add end-to-end encryption to an existing Matrix
client or library, read on.

// Send the requests here out and call machine.mark_request_as_sent().
Ok(())
}
```
It is recommended to use the [tutorial] to understand how end-to-end encryption
works in Matrix and how to add end-to-end encryption support in your Matrix
client library.

[Matrix]: https://matrix.org/
[matrix-sdk]: https://github.com/matrix-org/matrix-rust-sdk/

# Room key sharing algorithm
# Crate Feature Flags

The following crate feature flags are available:

The decision tree below visualizes the way this crate decides whether a room
key will be shared with a requester upon a key request.
| Feature | Default | Description |
| ------------------- | :-----: | -------------------------------------------------------------------------------------------------------------------------- |
| `qrcode` | No | Enables QR code based interactive verification |
| `js` | No | Enables JavaScript API usage for things like the current system time on WASM (does nothing on other targets) |
| `testing` | No | Provides facilities and functions for tests, in particular for integration testing store implementations. ATTENTION: do not ever use outside of tests, we do not provide any stability warantees on these, these are merely helpers. If you find you _need_ any function provided here outside of tests, please open a Github Issue and inform us about your use case for us to consider. |

![](https://raw.githubusercontent.com/matrix-org/matrix-rust-sdk/main/contrib/key-sharing-algorithm/model.png)
# Enabling logging

Users of the `matrix-sdk-crypto` crate can enable log output by depending on the
`tracing-subscriber` crate and including the following line in their
application (e.g. at the start of `main`):

# Crate Feature Flags
```rust
tracing_subscriber::fmt::init();
```

The following crate feature flags are available:
The log output is controlled via the `RUST_LOG` environment variable by
setting it to one of the `error`, `warn`, `info`, `debug` or `trace` levels.
The output is printed to stdout.

* `qrcode`: Enbles QRcode generation and reading code
The `RUST_LOG` variable also supports a more advanced syntax for filtering
log output more precisely, for instance with crate-level granularity. For
more information on this, check out the [tracing-subscriber documentation].

* `testing`: provides facilities and functions for tests, in particular for integration testing store implementations. ATTENTION: do not ever use outside of tests, we do not provide any stability warantees on these, these are merely helpers. If you find you _need_ any function provided here outside of tests, please open a Github Issue and inform us about your use case for us to consider.
[examples]: https://github.com/matrix-org/matrix-rust-sdk/tree/main/crates/matrix-sdk/examples
[tracing-subscriber documentation]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/

0 comments on commit e5f4cf6

Please sign in to comment.