crypto: Fix user-signing signature uploads

This commit is contained in:
Damir Jelić 2021-08-13 12:21:01 +02:00
parent 680f77beb9
commit 00e11d33f1
2 changed files with 30 additions and 24 deletions

View file

@ -395,7 +395,7 @@ impl PrivateCrossSigningIdentity {
&self,
user_identity: &ReadOnlyUserIdentity,
) -> Result<SignatureUploadRequest, SignatureError> {
let signed_keys = self
let master_key = self
.user_signing_key
.lock()
.await
@ -404,6 +404,17 @@ impl PrivateCrossSigningIdentity {
.sign_user(user_identity)
.await?;
let mut signed_keys = BTreeMap::new();
signed_keys.entry(user_identity.user_id().to_owned()).or_insert_with(BTreeMap::new).insert(
user_identity
.master_key()
.get_first_key()
.ok_or(SignatureError::MissingSigningKey)?
.to_owned(),
serde_json::to_value(master_key)?,
);
Ok(SignatureUploadRequest::new(signed_keys))
}
@ -632,10 +643,10 @@ impl PrivateCrossSigningIdentity {
#[cfg(test)]
mod test {
use std::{collections::BTreeMap, sync::Arc};
use std::sync::Arc;
use matrix_sdk_test::async_test;
use ruma::{encryption::CrossSigningKey, user_id, UserId};
use ruma::{user_id, UserId};
use super::{PrivateCrossSigningIdentity, Signing};
use crate::{
@ -755,24 +766,7 @@ mod test {
let user_signing = identity.user_signing_key.lock().await;
let user_signing = user_signing.as_ref().unwrap();
let signatures = user_signing.sign_user(&bob_public).await.unwrap();
let (key_id, signature) = signatures
.iter()
.next()
.unwrap()
.1
.iter()
.next()
.map(|(k, s)| (k.to_string(), serde_json::from_value(s.to_owned()).unwrap()))
.unwrap();
let mut master: CrossSigningKey = bob_public.master_key.as_ref().clone();
master
.signatures
.entry(identity.user_id().to_owned())
.or_insert_with(BTreeMap::new)
.insert(key_id, signature);
let master = user_signing.sign_user(&bob_public).await.unwrap();
bob_public.master_key = master.into();

View file

@ -24,7 +24,7 @@ use olm_rs::pk::OlmPkSigning;
#[cfg(test)]
use olm_rs::{errors::OlmUtilityError, utility::OlmUtility};
use ruma::{
encryption::{CrossSigningKey, DeviceKeys, KeyUsage},
encryption::{CrossSigningKey, CrossSigningKeySignatures, DeviceKeys, KeyUsage},
serde::CanonicalJsonValue,
DeviceKeyAlgorithm, DeviceKeyId, UserId,
};
@ -209,7 +209,19 @@ impl UserSigning {
pub async fn sign_user(
&self,
user: &ReadOnlyUserIdentity,
) -> Result<BTreeMap<UserId, BTreeMap<String, Value>>, SignatureError> {
) -> Result<CrossSigningKey, SignatureError> {
let signature = self.sign_user_helper(user).await?;
let mut master_key: CrossSigningKey = user.master_key().to_owned().into();
master_key.signatures.extend(signature);
Ok(master_key)
}
pub async fn sign_user_helper(
&self,
user: &ReadOnlyUserIdentity,
) -> Result<CrossSigningKeySignatures, SignatureError> {
let user_master: &CrossSigningKey = user.master_key().as_ref();
let signature = self.inner.sign_json(serde_json::to_value(user_master)?).await?;
@ -224,7 +236,7 @@ impl UserSigning {
self.inner.public_key.as_str().into(),
)
.to_string(),
serde_json::to_value(signature.0)?,
signature.0,
);
Ok(signatures)