mirror of
https://github.com/matrix-org/matrix-rust-sdk.git
synced 2026-05-18 13:40:55 -04:00
Merge branch 'main' into gnunicorn/issue133
This commit is contained in:
@@ -8,17 +8,17 @@ version = "1.0.0"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
criterion = { version = "0.3.4", features = ["async", "async_tokio", "html_reports"] }
|
||||
criterion = { version = "0.3.5", features = ["async", "async_tokio", "html_reports"] }
|
||||
matrix-sdk-crypto = { path = "../crates/matrix-sdk-crypto" }
|
||||
matrix-sdk-sled = { path = "../crates/matrix-sdk-sled", default-features = false, features = ["crypto-store"] }
|
||||
matrix-sdk-test = { path = "../crates/matrix-sdk-test" }
|
||||
ruma = { git = "https://github.com/ruma/ruma", rev = "4014e6959" }
|
||||
serde_json = "1.0.79"
|
||||
tempfile = "3.2.0"
|
||||
tokio = { version = "1.7.1", default-features = false, features = ["rt-multi-thread"] }
|
||||
tempfile = "3.3.0"
|
||||
tokio = { version = "1.17.0", default-features = false, features = ["rt-multi-thread"] }
|
||||
|
||||
[target.'cfg(target_os = "linux")'.dependencies]
|
||||
pprof = { version = "0.6.2", features = ["flamegraph", "criterion"] }
|
||||
pprof = { version = "0.8.0", features = ["flamegraph", "criterion"] }
|
||||
|
||||
[[bench]]
|
||||
name = "crypto_bench"
|
||||
|
||||
@@ -9,23 +9,23 @@ crate-type = ["cdylib", "lib"]
|
||||
name = "matrix_crypto"
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.56"
|
||||
anyhow = "1.0.57"
|
||||
base64 = "0.13.0"
|
||||
hmac = "0.11.0"
|
||||
http = "0.2.4"
|
||||
pbkdf2 = "0.8.0"
|
||||
rand = "0.8.4"
|
||||
serde = "1.0.126"
|
||||
serde_json = "1.0.64"
|
||||
sha2 = "0.9.5"
|
||||
thiserror = "1.0.25"
|
||||
tracing = "0.1.26"
|
||||
tracing-subscriber = "0.2.18"
|
||||
hmac = "0.12.1"
|
||||
http = "0.2.6"
|
||||
pbkdf2 = "0.11.0"
|
||||
rand = "0.8.5"
|
||||
serde = "1.0.136"
|
||||
serde_json = "1.0.79"
|
||||
sha2 = "0.10.2"
|
||||
thiserror = "1.0.30"
|
||||
tracing = "0.1.34"
|
||||
tracing-subscriber = { version = "0.3.11", features = ["env-filter"] }
|
||||
uniffi = "0.17.0"
|
||||
zeroize = { version = "1.3.0", features = ["zeroize_derive"] }
|
||||
|
||||
[dependencies.js_int]
|
||||
version = "0.2.1"
|
||||
version = "0.2.2"
|
||||
features = ["lax_deserialize"]
|
||||
|
||||
[dependencies.matrix-sdk-common]
|
||||
@@ -45,7 +45,7 @@ git = "https://github.com/matrix-org/vodozemac"
|
||||
rev = "e09c93f2c8df9770793abeec57ed984d5e1f3834"
|
||||
|
||||
[dependencies.tokio]
|
||||
version = "1.7.1"
|
||||
version = "1.17.0"
|
||||
default_features = false
|
||||
features = ["rt-multi-thread"]
|
||||
|
||||
|
||||
@@ -123,16 +123,16 @@ pub struct PickledInboundGroupSession {
|
||||
#[derive(thiserror::Error, Debug)]
|
||||
pub enum MigrationError {
|
||||
/// Generic catch all error variant.
|
||||
#[error("error migrating database: {message}")]
|
||||
#[error("error migrating database: {error_message}")]
|
||||
Generic {
|
||||
/// The error message
|
||||
message: String,
|
||||
error_message: String,
|
||||
},
|
||||
}
|
||||
|
||||
impl From<anyhow::Error> for MigrationError {
|
||||
fn from(e: anyhow::Error) -> MigrationError {
|
||||
MigrationError::Generic { message: e.to_string() }
|
||||
MigrationError::Generic { error_message: e.to_string() }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ impl Write for LoggerWrapper {
|
||||
}
|
||||
}
|
||||
|
||||
impl MakeWriter for LoggerWrapper {
|
||||
impl MakeWriter<'_> for LoggerWrapper {
|
||||
type Writer = LoggerWrapper;
|
||||
|
||||
fn make_writer(&self) -> Self::Writer {
|
||||
|
||||
@@ -32,7 +32,7 @@ use ruma::{
|
||||
},
|
||||
events::{
|
||||
key::verification::VerificationMethod, room::encrypted::OriginalSyncRoomEncryptedEvent,
|
||||
AnyMessageLikeEventContent, EventContent,
|
||||
AnyMessageLikeEventContent, AnySyncMessageLikeEvent, EventContent,
|
||||
},
|
||||
DeviceKeyAlgorithm, EventId, OwnedTransactionId, OwnedUserId, RoomId, UserId,
|
||||
};
|
||||
@@ -701,6 +701,28 @@ impl OlmMachine {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Receive an unencrypted verification event.
|
||||
///
|
||||
/// This method can be used to pass verification events that are happening
|
||||
/// in unencrypted rooms to the `OlmMachine`.
|
||||
///
|
||||
/// **Note**: This does not need to be called for encrypted events since
|
||||
/// those will get passed to the `OlmMachine` during decryption.
|
||||
pub fn receive_unencrypted_verification_event(
|
||||
&self,
|
||||
event: &str,
|
||||
room_id: &str,
|
||||
) -> Result<(), CryptoStoreError> {
|
||||
let room_id = RoomId::parse(room_id)?;
|
||||
let event: AnySyncMessageLikeEvent = serde_json::from_str(event)?;
|
||||
|
||||
let event = event.into_full_event(room_id);
|
||||
|
||||
self.runtime.block_on(self.inner.receive_unencrypted_verification_event(&event))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Get all the verification requests that we share with the given user.
|
||||
///
|
||||
/// # Arguments
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace olm {
|
||||
|
||||
[Error]
|
||||
interface MigrationError {
|
||||
Generic(string message);
|
||||
Generic(string error_message);
|
||||
};
|
||||
|
||||
callback interface Logger {
|
||||
@@ -299,6 +299,8 @@ interface OlmMachine {
|
||||
[Throws=CryptoStoreError]
|
||||
sequence<Request> share_room_key([ByRef] string room_id, sequence<string> users);
|
||||
|
||||
[Throws=CryptoStoreError]
|
||||
void receive_unencrypted_verification_event([ByRef] string event, [ByRef] string room_id);
|
||||
sequence<VerificationRequest> get_verification_requests([ByRef] string user_id);
|
||||
VerificationRequest? get_verification_request([ByRef] string user_id, [ByRef] string flow_id);
|
||||
Verification? get_verification([ByRef] string user_id, [ByRef] string flow_id);
|
||||
|
||||
@@ -22,11 +22,11 @@ decode_image = ["image", "rqrr", "qrcode/image", "qrcode/svg"]
|
||||
[dependencies]
|
||||
base64 = "0.13.0"
|
||||
byteorder = "1.4.3"
|
||||
image = { version = "0.23.14", optional = true }
|
||||
image = { version = "0.23.0", optional = true }
|
||||
qrcode = { version = "0.12.0", default-features = false }
|
||||
ruma-common = { git = "https://github.com/ruma/ruma", rev = "4014e6959" }
|
||||
rqrr = { version = "0.4.0", optional = true }
|
||||
thiserror = "1.0.25"
|
||||
thiserror = "1.0.30"
|
||||
|
||||
[dependencies.vodozemac]
|
||||
git = "https://github.com/matrix-org/vodozemac"
|
||||
|
||||
@@ -24,22 +24,22 @@ sso-login = ["matrix-sdk/sso-login"]
|
||||
docs = []
|
||||
|
||||
[dependencies]
|
||||
dashmap = "5.1.0"
|
||||
http = "0.2"
|
||||
dashmap = "5.2.0"
|
||||
http = "0.2.6"
|
||||
matrix-sdk = { version = "0.4", path = "../matrix-sdk", default-features = false, features = ["appservice"] }
|
||||
percent-encoding = "2.1.0"
|
||||
regex = "1"
|
||||
regex = "1.5.5"
|
||||
ruma = { git = "https://github.com/ruma/ruma", rev = "4014e6959", features = ["client-api-c", "appservice-api-s"] }
|
||||
serde = "1"
|
||||
serde_json = "1"
|
||||
serde_yaml = "0.8"
|
||||
thiserror = "1.0"
|
||||
tracing = "0.1"
|
||||
url = "2"
|
||||
warp = { version = "0.3.1", default-features = false }
|
||||
serde = "1.0.136"
|
||||
serde_json = "1.0.79"
|
||||
serde_yaml = "0.8.23"
|
||||
thiserror = "1.0.30"
|
||||
tracing = "0.1.34"
|
||||
url = "2.2.2"
|
||||
warp = { version = "0.3.2", default-features = false }
|
||||
|
||||
[dev-dependencies]
|
||||
matrix-sdk-test = { version = "0.4", path = "../matrix-sdk-test", features = ["appservice"] }
|
||||
mockito = "0.30"
|
||||
tokio = { version = "1", default-features = false, features = ["rt-multi-thread", "macros"] }
|
||||
tracing-subscriber = "0.3.7"
|
||||
mockito = "0.31.0"
|
||||
tokio = { version = "1.17.0", default-features = false, features = ["rt-multi-thread", "macros"] }
|
||||
tracing-subscriber = "0.3.11"
|
||||
|
||||
@@ -24,36 +24,36 @@ qrcode = ["matrix-sdk-crypto/qrcode"]
|
||||
testing = [ "http" ]
|
||||
|
||||
[dependencies]
|
||||
async-stream = "0.3.2"
|
||||
async-stream = "0.3.3"
|
||||
chacha20poly1305 = { version = "0.9.0", optional = true }
|
||||
dashmap = "5.1.0"
|
||||
futures-core = "0.3.15"
|
||||
futures-util = { version = "0.3.15", default-features = false }
|
||||
futures-channel = "0.3.15"
|
||||
hmac = { version = "0.12.0", optional = true }
|
||||
lru = "0.7.2"
|
||||
dashmap = "5.2.0"
|
||||
futures-core = "0.3.21"
|
||||
futures-util = { version = "0.3.21", default-features = false }
|
||||
futures-channel = "0.3.21"
|
||||
hmac = { version = "0.12.1", optional = true }
|
||||
lru = "0.7.5"
|
||||
matrix-sdk-common = { version = "0.4.0", path = "../matrix-sdk-common" }
|
||||
matrix-sdk-crypto = { version = "0.4.0", path = "../matrix-sdk-crypto", optional = true }
|
||||
pbkdf2 = { version = "0.10.0", default-features = false, optional = true }
|
||||
rand = { version = "0.8.4", optional = true }
|
||||
pbkdf2 = { version = "0.11.0", default-features = false, optional = true }
|
||||
rand = { version = "0.8.5", optional = true }
|
||||
ruma = { git = "https://github.com/ruma/ruma", rev = "4014e6959", features = ["client-api-c", "signatures"] }
|
||||
serde = { version = "1.0.126", features = ["rc"] }
|
||||
serde_json = "1.0.64"
|
||||
sha2 = { version = "0.10.1", optional = true }
|
||||
thiserror = "1.0.25"
|
||||
tracing = "0.1.26"
|
||||
serde = { version = "1.0.136", features = ["rc"] }
|
||||
serde_json = "1.0.79"
|
||||
sha2 = { version = "0.10.2", optional = true }
|
||||
thiserror = "1.0.30"
|
||||
tracing = "0.1.34"
|
||||
zeroize = { version = "1.3.0", features = ["zeroize_derive"] }
|
||||
anyhow = "1"
|
||||
http = { version = "0.2.4", optional = true }
|
||||
anyhow = "1.0.57"
|
||||
http = { version = "0.2.6", optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
futures = { version = "0.3.15", default-features = false, features = ["executor"] }
|
||||
futures = { version = "0.3.21", default-features = false, features = ["executor"] }
|
||||
tracing = { version = "0.1.26", features = ["log"] }
|
||||
http = "0.2.4"
|
||||
http = "0.2.6"
|
||||
assign = "1.1.1"
|
||||
env_logger = "0.9.0"
|
||||
matrix-sdk-test = { version = "0.4.0", path = "../matrix-sdk-test" }
|
||||
tokio = { version = "1.7.1", default-features = false, features = [
|
||||
tokio = { version = "1.17.0", default-features = false, features = [
|
||||
"rt-multi-thread",
|
||||
"macros",
|
||||
] }
|
||||
|
||||
@@ -238,6 +238,22 @@ impl BaseClient {
|
||||
self.sync_token.read().await.clone()
|
||||
}
|
||||
|
||||
#[cfg(feature = "encryption")]
|
||||
async fn handle_unenecrypted_verification_event(
|
||||
&self,
|
||||
event: &AnySyncMessageLikeEvent,
|
||||
room_id: &RoomId,
|
||||
) -> Result<()> {
|
||||
if let Some(olm) = self.olm_machine().await {
|
||||
olm.receive_unencrypted_verification_event(
|
||||
&event.clone().into_full_event(room_id.to_owned()),
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
async fn handle_timeline(
|
||||
&self,
|
||||
@@ -301,21 +317,34 @@ impl BaseClient {
|
||||
},
|
||||
|
||||
#[cfg(feature = "encryption")]
|
||||
AnySyncRoomEvent::MessageLike(AnySyncMessageLikeEvent::RoomEncrypted(
|
||||
SyncMessageLikeEvent::Original(encrypted),
|
||||
)) => {
|
||||
if let Some(olm) = self.olm_machine().await {
|
||||
if let Ok(decrypted) =
|
||||
olm.decrypt_room_event(encrypted, room_id).await
|
||||
{
|
||||
event = decrypted.into();
|
||||
AnySyncRoomEvent::MessageLike(e) => match e {
|
||||
AnySyncMessageLikeEvent::RoomEncrypted(
|
||||
SyncMessageLikeEvent::Original(encrypted),
|
||||
) => {
|
||||
if let Some(olm) = self.olm_machine().await {
|
||||
if let Ok(decrypted) =
|
||||
olm.decrypt_room_event(encrypted, room_id).await
|
||||
{
|
||||
event = decrypted.into();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO if there is redacted state save the room id,
|
||||
// event type and state key, add a method to get the
|
||||
// requests that are needed to be called to heal this
|
||||
// redacted state.
|
||||
AnySyncMessageLikeEvent::RoomMessage(
|
||||
SyncMessageLikeEvent::Original(original_event),
|
||||
) => match &original_event.content.msgtype {
|
||||
ruma::events::room::message::MessageType::VerificationRequest(
|
||||
_,
|
||||
) => {
|
||||
self.handle_unenecrypted_verification_event(e, room_id).await?;
|
||||
}
|
||||
_ => (),
|
||||
},
|
||||
_ if e.event_type().to_string().starts_with("m.key.verification") => {
|
||||
self.handle_unenecrypted_verification_event(e, room_id).await?;
|
||||
}
|
||||
_ => (),
|
||||
},
|
||||
#[cfg(not(feature = "encryption"))]
|
||||
_ => (),
|
||||
}
|
||||
|
||||
|
||||
@@ -16,26 +16,17 @@ default-target = "x86_64-unknown-linux-gnu"
|
||||
targets = ["x86_64-unknown-linux-gnu", "wasm32-unknown-unknown"]
|
||||
|
||||
[dependencies]
|
||||
async-trait = "0.1.50"
|
||||
async-trait = "0.1.53"
|
||||
ruma = { git = "https://github.com/ruma/ruma", rev = "4014e6959", features = ["client-api-c"] }
|
||||
serde = "1.0.126"
|
||||
serde = "1.0.136"
|
||||
|
||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||
uuid = { version = "0.8.2", default-features = false, features = [
|
||||
"v4",
|
||||
"serde",
|
||||
] }
|
||||
tokio = { version = "1.7.1", default-features = false, features = ["rt", "sync"] }
|
||||
tokio = { version = "1.17.0", default-features = false, features = ["rt", "sync"] }
|
||||
instant = { version = "0.1.12", features = ["now"] }
|
||||
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||
async-lock = "2.4.0"
|
||||
async-lock = "2.5.0"
|
||||
instant = { version = "0.1.12", features = ["wasm-bindgen", "inaccurate"] }
|
||||
futures-util = { version = "0.3.15", default-features = false, features = ["channel"] }
|
||||
wasm-bindgen-futures = "0.4.24"
|
||||
uuid = { version = "0.8.2", default-features = false, features = [
|
||||
"v4",
|
||||
"wasm-bindgen",
|
||||
"serde",
|
||||
] }
|
||||
futures-util = { version = "0.3.21", default-features = false, features = ["channel"] }
|
||||
wasm-bindgen-futures = "0.4.30"
|
||||
|
||||
@@ -25,35 +25,40 @@ docsrs = []
|
||||
testing = ["http"]
|
||||
|
||||
[dependencies]
|
||||
aes = { version = "0.7.4", features = ["ctr"] }
|
||||
aes-gcm = "0.9.2"
|
||||
atomic = "0.5.0"
|
||||
aes = "0.8.1"
|
||||
aes-gcm = "0.9.4"
|
||||
atomic = "0.5.1"
|
||||
base64 = "0.13.0"
|
||||
bs58 = { version = "0.4.0", optional = true }
|
||||
byteorder = "1.4.3"
|
||||
dashmap = "5.1.0"
|
||||
futures-util = { version = "0.3.15", default-features = false, features = ["alloc"] }
|
||||
hmac = "0.12.0"
|
||||
ctr = "0.9.1"
|
||||
dashmap = "5.2.0"
|
||||
futures-util = { version = "0.3.21", default-features = false, features = ["alloc"] }
|
||||
hmac = "0.12.1"
|
||||
matrix-qrcode = { version = "0.2.0", path = "../matrix-qrcode", optional = true }
|
||||
matrix-sdk-common = { version = "0.4.0", path = "../matrix-sdk-common" }
|
||||
olm-rs = { version = "2.1", features = ["serde"], optional = true }
|
||||
pbkdf2 = { version = "0.10.0", default-features = false }
|
||||
rand = "0.8.4"
|
||||
serde = { version = "1.0.126", features = ["derive", "rc"] }
|
||||
serde_json = "1.0.64"
|
||||
sha2 = "0.10.1"
|
||||
thiserror = "1.0.25"
|
||||
tracing = "0.1.26"
|
||||
olm-rs = { version = "2.2.0", features = ["serde"], optional = true }
|
||||
pbkdf2 = { version = "0.11.0", default-features = false }
|
||||
rand = "0.8.5"
|
||||
serde = { version = "1.0.136", features = ["derive", "rc"] }
|
||||
serde_json = "1.0.79"
|
||||
sha2 = "0.10.2"
|
||||
thiserror = "1.0.30"
|
||||
tracing = "0.1.34"
|
||||
zeroize = { version = "1.3.0", features = ["zeroize_derive"] }
|
||||
anyhow = "1"
|
||||
anyhow = "1.0.57"
|
||||
|
||||
# feature = testing only
|
||||
http = { version = "0.2.4", optional = true }
|
||||
http = { version = "0.2.6", optional = true }
|
||||
|
||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies.vodozemac]
|
||||
git = "https://github.com/matrix-org/vodozemac"
|
||||
rev = "e09c93f2c8df9770793abeec57ed984d5e1f3834"
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dev-dependencies.getrandom]
|
||||
version = "0.2.6"
|
||||
features = ["js"]
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies.vodozemac]
|
||||
git = "https://github.com/matrix-org/vodozemac"
|
||||
rev = "e09c93f2c8df9770793abeec57ed984d5e1f3834"
|
||||
@@ -65,13 +70,11 @@ rev = "4014e6959"
|
||||
features = ["client-api-c", "rand", "unstable-msc2676", "unstable-msc2677"]
|
||||
|
||||
[dev-dependencies]
|
||||
futures = { version = "0.3.15", default-features = false, features = [
|
||||
"executor",
|
||||
] }
|
||||
http = "0.2.4"
|
||||
indoc = "1.0.3"
|
||||
matches = "0.1.8"
|
||||
futures = { version = "0.3.21", default-features = false, features = ["executor"] }
|
||||
http = "0.2.6"
|
||||
indoc = "1.0.4"
|
||||
matches = "0.1.9"
|
||||
matrix-sdk-test = { version = "0.4.0", path = "../matrix-sdk-test" }
|
||||
proptest = "1.0.0"
|
||||
# required for async_test macro
|
||||
tokio = { version = "1.7.1", default-features = false, features = ["macros", "rt-multi-thread"] }
|
||||
tokio = { version = "1.17.0", default-features = false, features = ["macros", "rt-multi-thread"] }
|
||||
|
||||
@@ -18,8 +18,8 @@ use std::{
|
||||
};
|
||||
|
||||
use aes::{
|
||||
cipher::{generic_array::GenericArray, FromBlockCipher, NewBlockCipher, StreamCipher},
|
||||
Aes256, Aes256Ctr,
|
||||
cipher::{generic_array::GenericArray, KeyIvInit, StreamCipher},
|
||||
Aes256,
|
||||
};
|
||||
use base64::DecodeError;
|
||||
use rand::{thread_rng, RngCore};
|
||||
@@ -30,12 +30,14 @@ use ruma::{
|
||||
use serde::{Deserialize, Serialize};
|
||||
use sha2::{Digest, Sha256};
|
||||
use thiserror::Error;
|
||||
use zeroize::Zeroizing;
|
||||
use zeroize::Zeroize;
|
||||
|
||||
const IV_SIZE: usize = 16;
|
||||
const KEY_SIZE: usize = 32;
|
||||
const VERSION: &str = "v2";
|
||||
|
||||
type Aes256Ctr = ctr::Ctr128BE<Aes256>;
|
||||
|
||||
/// A wrapper that transparently encrypts anything that implements `Read` as an
|
||||
/// Matrix attachment.
|
||||
pub struct AttachmentDecryptor<'a, R: Read> {
|
||||
@@ -134,13 +136,20 @@ impl<'a, R: Read + 'a> AttachmentDecryptor<'a, R> {
|
||||
|
||||
let hash =
|
||||
info.hashes.get("sha256").ok_or(DecryptorError::MissingHash)?.as_bytes().to_owned();
|
||||
let key = Zeroizing::from(info.web_key.k.into_inner());
|
||||
let mut key = info.web_key.k.into_inner();
|
||||
let iv = info.iv.into_inner();
|
||||
|
||||
if key.len() != KEY_SIZE {
|
||||
return Err(DecryptorError::KeyNonceLength);
|
||||
}
|
||||
|
||||
let key_array = GenericArray::from_slice(&key);
|
||||
let iv = GenericArray::from_exact_iter(iv).ok_or(DecryptorError::KeyNonceLength)?;
|
||||
|
||||
let sha = Sha256::default();
|
||||
let aes = Aes256::new_from_slice(&key).map_err(|_| DecryptorError::KeyNonceLength)?;
|
||||
let aes = Aes256Ctr::from_block_cipher(aes, &iv);
|
||||
|
||||
let aes = Aes256Ctr::new(key_array, &iv);
|
||||
key.zeroize();
|
||||
|
||||
Ok(AttachmentDecryptor { inner: input, expected_hash: hash, sha, aes })
|
||||
}
|
||||
@@ -215,12 +224,12 @@ impl<'a, R: Read + ?Sized + 'a> AttachmentEncryptor<'a, R> {
|
||||
/// let key = encryptor.finish();
|
||||
/// ```
|
||||
pub fn new(reader: &'a mut R) -> Self {
|
||||
let mut key = Zeroizing::new([0u8; KEY_SIZE]);
|
||||
let mut iv = Zeroizing::new([0u8; IV_SIZE]);
|
||||
let mut key = [0u8; KEY_SIZE];
|
||||
let mut iv = [0u8; IV_SIZE];
|
||||
|
||||
let mut rng = thread_rng();
|
||||
|
||||
rng.fill_bytes(&mut *key);
|
||||
rng.fill_bytes(&mut key);
|
||||
// Only populate the first 8 bytes with randomness, the rest is 0
|
||||
// initialized for the counter.
|
||||
rng.fill_bytes(&mut iv[0..8]);
|
||||
@@ -229,15 +238,15 @@ impl<'a, R: Read + ?Sized + 'a> AttachmentEncryptor<'a, R> {
|
||||
kty: "oct".to_owned(),
|
||||
key_ops: vec!["encrypt".to_owned(), "decrypt".to_owned()],
|
||||
alg: "A256CTR".to_owned(),
|
||||
k: Base64::new((*key).to_vec()),
|
||||
k: Base64::new(key.to_vec()),
|
||||
ext: true,
|
||||
});
|
||||
let encoded_iv = Base64::new((*iv).to_vec());
|
||||
let iv = GenericArray::from_slice(&*iv);
|
||||
let key = GenericArray::from_slice(&*key);
|
||||
let encoded_iv = Base64::new((iv).to_vec());
|
||||
|
||||
let aes = Aes256::new(key);
|
||||
let aes = Aes256Ctr::from_block_cipher(aes, iv);
|
||||
let key_array = &key.into();
|
||||
|
||||
let aes = Aes256Ctr::new(key_array, &iv.into());
|
||||
key.zeroize();
|
||||
|
||||
AttachmentEncryptor {
|
||||
finished: false,
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
use std::io::{Cursor, Read, Seek, SeekFrom};
|
||||
|
||||
use aes::{
|
||||
cipher::{generic_array::GenericArray, FromBlockCipher, NewBlockCipher, StreamCipher},
|
||||
Aes256, Aes256Ctr,
|
||||
cipher::{generic_array::GenericArray, KeyIvInit, StreamCipher},
|
||||
Aes256,
|
||||
};
|
||||
use byteorder::{BigEndian, ReadBytesExt};
|
||||
use hmac::{Hmac, Mac};
|
||||
@@ -32,6 +32,8 @@ use crate::{
|
||||
utilities::{decode, encode, DecodeError},
|
||||
};
|
||||
|
||||
type Aes256Ctr = ctr::Ctr128BE<Aes256>;
|
||||
|
||||
const SALT_SIZE: usize = 16;
|
||||
const IV_SIZE: usize = 16;
|
||||
const MAC_SIZE: usize = 32;
|
||||
@@ -169,24 +171,23 @@ fn encrypt_helper(plaintext: &mut [u8], passphrase: &str, rounds: u32) -> String
|
||||
|
||||
let mut iv = u128::from_be_bytes(iv);
|
||||
iv &= !(1 << 63);
|
||||
let iv = iv.to_be_bytes();
|
||||
|
||||
pbkdf2::<Hmac<Sha512>>(passphrase.as_bytes(), &salt, rounds, &mut derived_keys);
|
||||
let (key, hmac_key) = derived_keys.split_at(KEY_SIZE);
|
||||
|
||||
let key = GenericArray::from_slice(key);
|
||||
let iv = iv.to_be_bytes();
|
||||
let iv = GenericArray::from_slice(&iv);
|
||||
|
||||
let aes = Aes256::new(key);
|
||||
let mut aes = Aes256Ctr::from_block_cipher(aes, iv);
|
||||
// This is fine because the key is guaranteed to be 32 bytes, derive 64
|
||||
// bytes and split at the middle.
|
||||
let key_array = GenericArray::from_slice(key);
|
||||
|
||||
let mut aes = Aes256Ctr::new(key_array, &iv.into());
|
||||
aes.apply_keystream(plaintext);
|
||||
|
||||
let mut payload: Vec<u8> = vec![];
|
||||
|
||||
payload.extend(&VERSION.to_be_bytes());
|
||||
payload.extend(&salt);
|
||||
payload.extend(&*iv);
|
||||
payload.extend(&iv);
|
||||
payload.extend(&rounds.to_be_bytes());
|
||||
payload.extend_from_slice(plaintext);
|
||||
|
||||
@@ -196,6 +197,8 @@ fn encrypt_helper(plaintext: &mut [u8], passphrase: &str, rounds: u32) -> String
|
||||
|
||||
payload.extend(mac.into_bytes());
|
||||
|
||||
derived_keys.zeroize();
|
||||
|
||||
encode(payload)
|
||||
}
|
||||
|
||||
@@ -234,16 +237,17 @@ fn decrypt_helper(ciphertext: &str, passphrase: &str) -> Result<String, KeyExpor
|
||||
hmac.update(&decoded[0..ciphertext_end]);
|
||||
hmac.verify_slice(&mac).map_err(|_| KeyExportError::InvalidMac)?;
|
||||
|
||||
let key = GenericArray::from_slice(key);
|
||||
let iv = GenericArray::from_slice(&iv);
|
||||
// This is fine because the key is guaranteed to be 32 bytes, derive 64
|
||||
// bytes and split at the middle.
|
||||
let key_array = GenericArray::from_slice(key);
|
||||
|
||||
let ciphertext = &mut decoded[ciphertext_start..ciphertext_end];
|
||||
let aes = Aes256::new(key);
|
||||
let mut aes = Aes256Ctr::from_block_cipher(aes, iv);
|
||||
let mut aes = Aes256Ctr::new(key_array, &iv.into());
|
||||
aes.apply_keystream(ciphertext);
|
||||
|
||||
let ret = String::from_utf8(ciphertext.to_owned());
|
||||
|
||||
derived_keys.zeroize();
|
||||
ciphertext.zeroize();
|
||||
|
||||
Ok(ret?)
|
||||
|
||||
@@ -40,7 +40,7 @@ use ruma::{
|
||||
},
|
||||
room_key::ToDeviceRoomKeyEvent,
|
||||
secret::request::SecretName,
|
||||
AnyRoomEvent, AnyToDeviceEvent, MessageLikeEventContent,
|
||||
AnyMessageLikeEvent, AnyRoomEvent, AnyToDeviceEvent, MessageLikeEventContent,
|
||||
},
|
||||
DeviceId, DeviceKeyAlgorithm, DeviceKeyId, EventEncryptionAlgorithm, OwnedDeviceId,
|
||||
OwnedDeviceKeyId, OwnedTransactionId, OwnedUserId, RoomId, TransactionId, UInt, UserId,
|
||||
@@ -723,6 +723,20 @@ impl OlmMachine {
|
||||
self.group_session_manager.share_group_session(room_id, users, encryption_settings).await
|
||||
}
|
||||
|
||||
/// Receive an unencrypted verification event.
|
||||
///
|
||||
/// This method can be used to pass verification events that are happening
|
||||
/// in unencrypted rooms to the `OlmMachine`.
|
||||
///
|
||||
/// **Note**: This does not need to be called for encrypted events since
|
||||
/// those will get passed to the `OlmMachine` during decryption.
|
||||
pub async fn receive_unencrypted_verification_event(
|
||||
&self,
|
||||
event: &AnyMessageLikeEvent,
|
||||
) -> StoreResult<()> {
|
||||
self.verification_machine.receive_any_event(event).await
|
||||
}
|
||||
|
||||
/// Receive and properly handle a decrypted to-device event.
|
||||
///
|
||||
/// # Arguments
|
||||
|
||||
@@ -11,31 +11,31 @@ encryption = ["matrix-sdk-base/encryption", "matrix-sdk-crypto"]
|
||||
default-target = "wasm32-unknown-unknown"
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1"
|
||||
base64 = { version = "0.13.0" }
|
||||
dashmap = "5.1.0"
|
||||
futures-util = { version = "0.3.15", default-features = false }
|
||||
indexed_db_futures = { version = "0.2.0" }
|
||||
anyhow = "1.0.57"
|
||||
base64 = "0.13.0"
|
||||
dashmap = "5.2.0"
|
||||
futures-util = { version = "0.3.21", default-features = false }
|
||||
indexed_db_futures = "0.2.3"
|
||||
matrix-sdk-base = { path = "../matrix-sdk-base" }
|
||||
matrix-sdk-store-encryption = { path = "../matrix-sdk-store-encryption" }
|
||||
serde = { version = "1.0.126" }
|
||||
serde_json = "1.0.64"
|
||||
thiserror = "1.0.25"
|
||||
tracing = "0.1.26"
|
||||
wasm-bindgen = { version = "0.2.74", features = ["serde-serialize"] }
|
||||
web-sys = { version = "0.3.35", features = ["IdbKeyRange"] }
|
||||
serde = "1.0.136"
|
||||
serde_json = "1.0.79"
|
||||
thiserror = "1.0.30"
|
||||
tracing = "0.1.34"
|
||||
wasm-bindgen = { version = "0.2.80", features = ["serde-serialize"] }
|
||||
web-sys = { version = "0.3.57", features = ["IdbKeyRange"] }
|
||||
|
||||
matrix-sdk-crypto = { path = "../matrix-sdk-crypto", optional = true }
|
||||
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||
# for wasm32 we need to activate this
|
||||
getrandom = { version = "0.2", features = ["js"] }
|
||||
getrandom = { version = "0.2.6", features = ["js"] }
|
||||
|
||||
[dev-dependencies]
|
||||
matrix-sdk-common = { path = "../matrix-sdk-common" }
|
||||
matrix-sdk-base = { path = "../matrix-sdk-base", features = ["testing"] }
|
||||
matrix-sdk-crypto = { path = "../matrix-sdk-crypto", features = ["testing"] }
|
||||
matrix-sdk-test = { path = "../matrix-sdk-test" }
|
||||
uuid = "0.8"
|
||||
wasm-bindgen-test = "0.3.24"
|
||||
uuid = "1.0.0"
|
||||
wasm-bindgen-test = "0.3.30"
|
||||
|
||||
@@ -10,29 +10,29 @@ state-store = ["matrix-sdk-base"]
|
||||
crypto-store = ["matrix-sdk-crypto"]
|
||||
|
||||
[dependencies]
|
||||
futures-core = "0.3.15"
|
||||
futures-util = { version = "0.3.15", default-features = false }
|
||||
futures-core = "0.3.21"
|
||||
futures-util = { version = "0.3.21", default-features = false }
|
||||
matrix-sdk-base = { path = "../matrix-sdk-base", optional = true }
|
||||
matrix-sdk-common = { path = "../matrix-sdk-common" }
|
||||
matrix-sdk-crypto = { path = "../matrix-sdk-crypto", optional = true }
|
||||
matrix-sdk-store-encryption = { path = "../matrix-sdk-store-encryption" }
|
||||
async-stream = "0.3.2"
|
||||
serde = "1"
|
||||
serde_json = "1.0.64"
|
||||
sled = { version = "0.34.6" }
|
||||
thiserror = "1.0.25"
|
||||
tokio = { version = "1.7.1", default-features = false, features = ["sync", "fs"] }
|
||||
tracing = "0.1.26"
|
||||
anyhow = "1"
|
||||
dashmap = "5.1.0"
|
||||
async-stream = "0.3.3"
|
||||
serde = "1.0.136"
|
||||
serde_json = "1.0.79"
|
||||
sled = "0.34.7"
|
||||
thiserror = "1.0.30"
|
||||
tokio = { version = "1.17.0", default-features = false, features = ["sync", "fs"] }
|
||||
tracing = "0.1.34"
|
||||
anyhow = "1.0.57"
|
||||
dashmap = "5.2.0"
|
||||
|
||||
[dev-dependencies]
|
||||
lazy_static = "1.4"
|
||||
tempfile = "3.2.0"
|
||||
lazy_static = "1.4.0"
|
||||
tempfile = "3.3.0"
|
||||
matrix-sdk-test = { version = "0.4.0", path = "../matrix-sdk-test" }
|
||||
matrix-sdk-crypto = { path = "../matrix-sdk-crypto", features = ["testing"] }
|
||||
matrix-sdk-base = { path = "../matrix-sdk-base", features = ["testing"] }
|
||||
tokio = { version = "1.7.1", default-features = false, features = [
|
||||
tokio = { version = "1.17.0", default-features = false, features = [
|
||||
"rt-multi-thread",
|
||||
"macros",
|
||||
] }
|
||||
|
||||
@@ -12,16 +12,16 @@ js = ["getrandom/js"]
|
||||
[dependencies]
|
||||
blake3 = "1.3.1"
|
||||
chacha20poly1305 = { version = "0.9.0", features = ["std"] }
|
||||
displaydoc = "0.2"
|
||||
getrandom = { version = "0.2.5", optional = true }
|
||||
displaydoc = "0.2.3"
|
||||
getrandom = { version = "0.2.6", optional = true }
|
||||
hmac = "0.12.1"
|
||||
pbkdf2 = "0.10.1"
|
||||
rand = "0.8.4"
|
||||
serde = { version = "1.0.126", features = ["derive"] }
|
||||
serde_json = "1.0.64"
|
||||
pbkdf2 = "0.11.0"
|
||||
rand = "0.8.5"
|
||||
serde = { version = "1.0.136", features = ["derive"] }
|
||||
serde_json = "1.0.79"
|
||||
sha2 = "0.10.2"
|
||||
thiserror = "1.0.26"
|
||||
thiserror = "1.0.30"
|
||||
zeroize = { version = "1.3.0", features = ["zeroize_derive"] }
|
||||
|
||||
[dev-dependencies]
|
||||
anyhow = "1.0.56"
|
||||
anyhow = "1.0.57"
|
||||
|
||||
@@ -15,6 +15,6 @@ version = "0.1.0"
|
||||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
proc-macro2 = "1.0.29"
|
||||
quote = "1"
|
||||
syn = { version = "1.0.81", features = ["full",] }
|
||||
proc-macro2 = "1.0.37"
|
||||
quote = "1.0.18"
|
||||
syn = { version = "1.0.91", features = ["full"] }
|
||||
|
||||
@@ -15,9 +15,9 @@ version = "0.4.0"
|
||||
appservice = []
|
||||
|
||||
[dependencies]
|
||||
http = "0.2.4"
|
||||
http = "0.2.6"
|
||||
lazy_static = "1.4.0"
|
||||
matrix-sdk-test-macros = { version = "0.1.0", path = "../matrix-sdk-test-macros" }
|
||||
ruma = { git = "https://github.com/ruma/ruma", rev = "4014e6959", features = ["client-api-c"] }
|
||||
serde = "1.0.126"
|
||||
serde_json = "1.0.64"
|
||||
serde = "1.0.136"
|
||||
serde_json = "1.0.79"
|
||||
|
||||
@@ -49,31 +49,31 @@ docsrs = [
|
||||
]
|
||||
|
||||
[dependencies]
|
||||
anyhow = { version = "1.0.42", optional = true }
|
||||
anyhow = { version = "1.0.57", optional = true }
|
||||
anymap2 = "0.13.0"
|
||||
bytes = "1.0.1"
|
||||
dashmap = "5.1.0"
|
||||
event-listener = "2.5.1"
|
||||
eyre = { version = "0.6.5", optional = true }
|
||||
futures-core = "0.3.15"
|
||||
futures-util = { version = "0.3.15", default-features = false }
|
||||
http = "0.2.4"
|
||||
bytes = "1.1.0"
|
||||
dashmap = "5.2.0"
|
||||
event-listener = "2.5.2"
|
||||
eyre = { version = "0.6.8", optional = true }
|
||||
futures-core = "0.3.21"
|
||||
futures-util = { version = "0.3.21", default-features = false }
|
||||
http = "0.2.6"
|
||||
matrix-sdk-common = { version = "0.4.0", path = "../matrix-sdk-common" }
|
||||
mime = "0.3.16"
|
||||
rand = { version = "0.8.4", optional = true }
|
||||
serde = "1.0.126"
|
||||
serde_json = "1.0.64"
|
||||
thiserror = "1.0.25"
|
||||
tracing = "0.1.26"
|
||||
rand = { version = "0.8.5", optional = true }
|
||||
serde = "1.0.136"
|
||||
serde_json = "1.0.79"
|
||||
thiserror = "1.0.30"
|
||||
tracing = "0.1.34"
|
||||
url = "2.2.2"
|
||||
zeroize = "1.3.0"
|
||||
async-stream = "0.3.2"
|
||||
async-stream = "0.3.3"
|
||||
|
||||
matrix-sdk-sled = { path = "../matrix-sdk-sled", default-features = false, optional = true }
|
||||
matrix-sdk-indexeddb = { path = "../matrix-sdk-indexeddb", default-features = false, optional = true }
|
||||
|
||||
[dependencies.image]
|
||||
version = "0.24.0"
|
||||
version = "0.24.2"
|
||||
default-features = false
|
||||
features = [
|
||||
"gif",
|
||||
@@ -98,7 +98,7 @@ path = "../matrix-sdk-base"
|
||||
default_features = false
|
||||
|
||||
[dependencies.reqwest]
|
||||
version = "0.11.3"
|
||||
version = "0.11.10"
|
||||
default_features = false
|
||||
|
||||
[dependencies.ruma]
|
||||
@@ -107,47 +107,47 @@ rev = "4014e6959"
|
||||
features = ["client-api-c", "compat", "rand", "unstable-msc2448"]
|
||||
|
||||
[dependencies.tokio-stream]
|
||||
version = "0.1.6"
|
||||
version = "0.1.8"
|
||||
features = ["net"]
|
||||
optional = true
|
||||
|
||||
[dependencies.warp]
|
||||
version = "0.3.1"
|
||||
version = "0.3.2"
|
||||
default-features = false
|
||||
optional = true
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies.wasm-timer]
|
||||
version = "0.2.5"
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||
wasm-timer= "0.2.5"
|
||||
|
||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies.backoff]
|
||||
version = "0.4.0"
|
||||
features = ["tokio"]
|
||||
|
||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies.tokio]
|
||||
version = "1.7.1"
|
||||
version = "1.17.0"
|
||||
default-features = false
|
||||
features = ["fs", "rt"]
|
||||
|
||||
[dev-dependencies]
|
||||
anyhow = "1.0"
|
||||
anyhow = "1.0.57"
|
||||
dirs = "4.0.0"
|
||||
futures = { version = "0.3.15", default-features = false, features = ["executor"] }
|
||||
futures = { version = "0.3.21", default-features = false, features = ["executor"] }
|
||||
lazy_static = "1.4.0"
|
||||
matches = "0.1.8"
|
||||
matches = "0.1.9"
|
||||
matrix-sdk-test = { version = "0.4.0", path = "../matrix-sdk-test" }
|
||||
mockito = "0.30.0"
|
||||
serde_json = "1.0.64"
|
||||
tempfile = "3.2.0"
|
||||
tracing-subscriber = { version = "0.3.7", features = ["env-filter"] }
|
||||
mockito = "0.31.0"
|
||||
serde_json = "1.0.79"
|
||||
tempfile = "3.3.0"
|
||||
tracing-subscriber = { version = "0.3.11", features = ["env-filter"] }
|
||||
|
||||
|
||||
[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies.tokio]
|
||||
version = "1.7.1"
|
||||
version = "1.17.0"
|
||||
default-features = false
|
||||
features = ["rt-multi-thread", "macros"]
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dev-dependencies]
|
||||
wasm-bindgen-test = "0.3.24"
|
||||
wasm-bindgen-test = "0.3.30"
|
||||
|
||||
[[example]]
|
||||
name = "cross_signing_bootstrap"
|
||||
|
||||
@@ -6,12 +6,12 @@ publish = false
|
||||
|
||||
[dependencies]
|
||||
atty = "0.2.14"
|
||||
clap = "3.1.0"
|
||||
futures = { version = "0.3.15", default-features = false, features = ["executor"] }
|
||||
clap = "3.1.12"
|
||||
futures = { version = "0.3.21", default-features = false, features = ["executor"] }
|
||||
matrix-sdk-base = { path = "../../crates/matrix-sdk-base" }
|
||||
matrix-sdk-sled = { path = "../../crates/matrix-sdk-sled" }
|
||||
rustyline = "9.0.0"
|
||||
rustyline = "9.1.2"
|
||||
rustyline-derive = "0.6.0"
|
||||
serde = "1.0.136"
|
||||
serde_json = "1.0.79"
|
||||
syntect = "4.5.0"
|
||||
syntect = "4.6.0"
|
||||
|
||||
@@ -5,7 +5,7 @@ edition = "2021"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
clap = { version = "3.1.3", features = ["derive"] }
|
||||
clap = { version = "3.1.12", features = ["derive"] }
|
||||
serde = { version = "1.0.136", features = ["derive"] }
|
||||
serde_json = "1.0.79"
|
||||
xshell = "0.1.17"
|
||||
|
||||
Reference in New Issue
Block a user