1use std::{
16 collections::HashMap,
17 ops::{Deref, DerefMut},
18 sync::{
19 Arc,
20 atomic::{AtomicBool, Ordering},
21 },
22};
23
24use as_variant::as_variant;
25use matrix_sdk_common::locks::RwLock;
26use ruma::{
27 DeviceId, EventId, OwnedDeviceId, OwnedUserId, RoomId, UserId,
28 api::client::keys::upload_signatures::v3::{Request as SignatureUploadRequest, SignedKeys},
29 events::{key::verification::VerificationMethod, room::message::MessageType},
30};
31use serde::{Deserialize, Deserializer, Serialize};
32use serde_json::Value;
33use tracing::{error, info};
34
35#[cfg(feature = "experimental-x509-identity-verification")]
36use crate::x509::X509Verifier;
37use crate::{
38 CryptoStoreError, DeviceData, VerificationRequest,
39 error::SignatureError,
40 store::{
41 Store,
42 types::{Changes, IdentityChanges},
43 },
44 types::{
45 CrossSigningKey, MasterPubkey, SelfSigningPubkey, UserSigningPubkey,
46 requests::OutgoingVerificationRequest,
47 },
48 verification::VerificationMachine,
49};
50
51#[derive(Debug, Clone)]
53pub enum UserIdentity {
54 Own(OwnUserIdentity),
56 Other(OtherUserIdentity),
58}
59
60impl UserIdentity {
61 pub fn own(self) -> Option<OwnUserIdentity> {
64 as_variant!(self, Self::Own)
65 }
66
67 pub fn other(self) -> Option<OtherUserIdentity> {
70 as_variant!(self, Self::Other)
71 }
72
73 pub fn user_id(&self) -> &UserId {
75 match self {
76 UserIdentity::Own(u) => u.user_id(),
77 UserIdentity::Other(u) => u.user_id(),
78 }
79 }
80
81 pub(crate) fn new(
82 store: Store,
83 identity: UserIdentityData,
84 verification_machine: VerificationMachine,
85 own_identity: Option<OwnUserIdentityData>,
86 ) -> Self {
87 match identity {
88 UserIdentityData::Own(i) => {
89 Self::Own(OwnUserIdentity { inner: i, verification_machine, store })
90 }
91 UserIdentityData::Other(i) => {
92 #[cfg(feature = "experimental-x509-identity-verification")]
95 let x509_verifier = store.x509_verifier().cloned();
96
97 Self::Other(OtherUserIdentity {
98 inner: i,
99 own_identity,
100 #[cfg(feature = "experimental-x509-identity-verification")]
101 x509_verifier,
102 verification_machine,
103 })
104 }
105 }
106 }
107
108 pub fn is_verified(&self) -> bool {
119 match self {
120 UserIdentity::Own(u) => u.is_verified(),
121 UserIdentity::Other(u) => u.is_verified(),
122 }
123 }
124
125 pub fn was_previously_verified(&self) -> bool {
130 match self {
131 UserIdentity::Own(u) => u.was_previously_verified(),
132 UserIdentity::Other(u) => u.was_previously_verified(),
133 }
134 }
135
136 pub async fn withdraw_verification(&self) -> Result<(), CryptoStoreError> {
140 match self {
141 UserIdentity::Own(u) => u.withdraw_verification().await,
142 UserIdentity::Other(u) => u.withdraw_verification().await,
143 }
144 }
145
146 pub async fn pin(&self) -> Result<(), CryptoStoreError> {
162 match self {
163 UserIdentity::Own(_) => {
164 Ok(())
167 }
168 UserIdentity::Other(u) => u.pin_current_master_key().await,
169 }
170 }
171
172 pub fn has_verification_violation(&self) -> bool {
174 match self {
175 UserIdentity::Own(u) => u.has_verification_violation(),
176 UserIdentity::Other(u) => u.has_verification_violation(),
177 }
178 }
179}
180
181impl From<OwnUserIdentity> for UserIdentity {
182 fn from(i: OwnUserIdentity) -> Self {
183 Self::Own(i)
184 }
185}
186
187impl From<OtherUserIdentity> for UserIdentity {
188 fn from(i: OtherUserIdentity) -> Self {
189 Self::Other(i)
190 }
191}
192
193#[derive(Debug, Clone)]
202pub struct OwnUserIdentity {
203 pub(crate) inner: OwnUserIdentityData,
204 pub(crate) verification_machine: VerificationMachine,
205 store: Store,
206}
207
208impl Deref for OwnUserIdentity {
209 type Target = OwnUserIdentityData;
210
211 fn deref(&self) -> &Self::Target {
212 &self.inner
213 }
214}
215
216impl DerefMut for OwnUserIdentity {
217 fn deref_mut(&mut self) -> &mut <Self as Deref>::Target {
218 &mut self.inner
219 }
220}
221
222impl OwnUserIdentity {
223 pub async fn verify(&self) -> Result<SignatureUploadRequest, SignatureError> {
230 self.mark_as_verified();
231
232 let changes = Changes {
233 identities: IdentityChanges {
234 changed: vec![self.inner.clone().into()],
235 new: vec![],
236 unchanged: vec![],
237 },
238 ..Default::default()
239 };
240
241 if let Err(e) = self.verification_machine.store.save_changes(changes).await {
242 error!(error = ?e, "Couldn't store our own user identity after marking it as verified");
243 }
244
245 let cache = self.store.cache().await?;
246 let account = cache.account().await?;
247 #[cfg(feature = "experimental-x509-identity-verification")]
248 let x509_signer = self.store.x509_signer();
249
250 let public_key = self
251 .master_key
252 .get_first_key()
253 .ok_or(SignatureError::MissingSigningKey)?
254 .to_base64()
255 .into();
256
257 let mut cross_signing_key: CrossSigningKey = (*self.master_key).as_ref().clone();
258 cross_signing_key.signatures.clear();
259 account.sign_cross_signing_key(&mut cross_signing_key)?;
260
261 #[cfg(feature = "experimental-x509-identity-verification")]
265 if let Some(x509_signer) = x509_signer {
266 x509_signer.sign_cross_signing_key(&self.user_id, &mut cross_signing_key)?;
267 }
268
269 let mut user_signed_keys = SignedKeys::new();
270 user_signed_keys.add_cross_signing_keys(public_key, cross_signing_key.to_raw());
271
272 let signed_keys = [(self.user_id().to_owned(), user_signed_keys)].into();
273 Ok(SignatureUploadRequest::new(signed_keys))
274 }
275
276 pub async fn request_verification(
278 &self,
279 ) -> Result<(VerificationRequest, OutgoingVerificationRequest), CryptoStoreError> {
280 self.request_verification_helper(None).await
281 }
282
283 pub async fn request_verification_with_methods(
290 &self,
291 methods: Vec<VerificationMethod>,
292 ) -> Result<(VerificationRequest, OutgoingVerificationRequest), CryptoStoreError> {
293 self.request_verification_helper(Some(methods)).await
294 }
295
296 pub async fn trusts_our_own_device(&self) -> Result<bool, CryptoStoreError> {
299 Ok(if let Some(signatures) = self.verification_machine.store.device_signatures().await? {
300 let mut device_keys = self.store.cache().await?.account().await?.device_keys();
301 device_keys.signatures = signatures;
302
303 self.inner.self_signing_key().verify_device_keys(&device_keys).is_ok()
304 } else {
305 false
306 })
307 }
308
309 async fn request_verification_helper(
310 &self,
311 methods: Option<Vec<VerificationMethod>>,
312 ) -> Result<(VerificationRequest, OutgoingVerificationRequest), CryptoStoreError> {
313 let all_devices = self.verification_machine.store.get_user_devices(self.user_id()).await?;
314 let devices = self
315 .inner
316 .filter_devices_to_request(all_devices, self.verification_machine.own_device_id());
317
318 Ok(self.verification_machine.request_to_device_verification(
319 self.user_id(),
320 devices,
321 methods,
322 ))
323 }
324
325 pub async fn withdraw_verification(&self) -> Result<(), CryptoStoreError> {
327 self.inner.withdraw_verification();
328 let to_save = UserIdentityData::Own(self.inner.clone());
329 let changes = Changes {
330 identities: IdentityChanges { changed: vec![to_save], ..Default::default() },
331 ..Default::default()
332 };
333 self.verification_machine.store.inner().save_changes(changes).await?;
334 Ok(())
335 }
336}
337
338#[derive(Debug, Clone)]
347pub struct OtherUserIdentity {
348 pub(crate) inner: OtherUserIdentityData,
349 pub(crate) own_identity: Option<OwnUserIdentityData>,
350 pub(crate) verification_machine: VerificationMachine,
351
352 #[cfg(feature = "experimental-x509-identity-verification")]
353 pub(crate) x509_verifier: Option<X509Verifier>,
354}
355
356impl Deref for OtherUserIdentity {
357 type Target = OtherUserIdentityData;
358
359 fn deref(&self) -> &Self::Target {
360 &self.inner
361 }
362}
363
364impl DerefMut for OtherUserIdentity {
365 fn deref_mut(&mut self) -> &mut <Self as Deref>::Target {
366 &mut self.inner
367 }
368}
369
370impl OtherUserIdentity {
371 pub fn is_verified(&self) -> bool {
373 let is_cross_signed = self
374 .own_identity
375 .as_ref()
376 .is_some_and(|own_identity| own_identity.is_identity_verified(&self.inner));
377
378 #[cfg(feature = "experimental-x509-identity-verification")]
380 {
381 let is_x509_signed = || {
382 self.x509_verifier.as_ref().is_some_and(|verifier| {
383 verifier.verify_signed_object(&self.user_id, self.inner.master_key().as_ref())
384 })
385 };
386
387 is_cross_signed || is_x509_signed()
388 }
389
390 #[cfg(not(feature = "experimental-x509-identity-verification"))]
391 is_cross_signed
392 }
393
394 pub async fn verify(&self) -> Result<SignatureUploadRequest, SignatureError> {
405 if self.user_id() != self.verification_machine.own_user_id() {
406 Ok(self
407 .verification_machine
408 .store
409 .private_identity
410 .lock()
411 .await
412 .sign_user(&self.inner)
413 .await?)
414 } else {
415 Err(SignatureError::UserIdMismatch)
416 }
417 }
418
419 pub fn request_verification(
423 &self,
424 room_id: &RoomId,
425 request_event_id: &EventId,
426 methods: Option<Vec<VerificationMethod>>,
427 ) -> VerificationRequest {
428 self.verification_machine.request_verification(
429 &self.inner,
430 room_id,
431 request_event_id,
432 methods,
433 )
434 }
435
436 pub fn verification_request_content(
443 &self,
444 methods: Option<Vec<VerificationMethod>>,
445 ) -> MessageType {
446 MessageType::VerificationRequest(VerificationRequest::request(
447 self.verification_machine.own_user_id(),
448 self.verification_machine.own_device_id(),
449 self.user_id(),
450 methods,
451 ))
452 }
453
454 pub async fn pin_current_master_key(&self) -> Result<(), CryptoStoreError> {
456 info!(master_key = ?self.master_key.get_first_key(), "Pinning current identity for user '{}'", self.user_id());
457 self.inner.pin();
458 let to_save = UserIdentityData::Other(self.inner.clone());
459 let changes = Changes {
460 identities: IdentityChanges { changed: vec![to_save], ..Default::default() },
461 ..Default::default()
462 };
463 self.verification_machine.store.inner().save_changes(changes).await?;
464 Ok(())
465 }
466
467 pub fn identity_needs_user_approval(&self) -> bool {
481 if self.is_verified() {
483 return false;
484 }
485 self.inner.has_pin_violation()
488 }
489
490 pub async fn withdraw_verification(&self) -> Result<(), CryptoStoreError> {
492 info!(
493 master_key = ?self.master_key.get_first_key(),
494 user = ?self.user_id(),
495 "Withdrawing verification status and pinning current identity"
496 );
497 self.inner.withdraw_verification();
498 let to_save = UserIdentityData::Other(self.inner.clone());
499 let changes = Changes {
500 identities: IdentityChanges { changed: vec![to_save], ..Default::default() },
501 ..Default::default()
502 };
503 self.verification_machine.store.inner().save_changes(changes).await?;
504 Ok(())
505 }
506
507 #[cfg(test)]
510 pub async fn mark_as_previously_verified(&self) -> Result<(), CryptoStoreError> {
511 self.inner.mark_as_previously_verified();
512
513 let to_save = UserIdentityData::Other(self.inner.clone());
514 let changes = Changes {
515 identities: IdentityChanges { changed: vec![to_save], ..Default::default() },
516 ..Default::default()
517 };
518
519 self.verification_machine.store.inner().save_changes(changes).await?;
520
521 Ok(())
522 }
523
524 pub fn has_verification_violation(&self) -> bool {
534 if !self.inner.was_previously_verified() {
535 return false;
537 }
538
539 !self.is_verified()
540 }
541}
542
543#[derive(Debug, Clone, Serialize, Deserialize)]
545pub enum UserIdentityData {
546 Own(OwnUserIdentityData),
548 Other(OtherUserIdentityData),
550}
551
552impl From<OwnUserIdentityData> for UserIdentityData {
553 fn from(identity: OwnUserIdentityData) -> Self {
554 UserIdentityData::Own(identity)
555 }
556}
557
558impl From<OtherUserIdentityData> for UserIdentityData {
559 fn from(identity: OtherUserIdentityData) -> Self {
560 UserIdentityData::Other(identity)
561 }
562}
563
564impl UserIdentityData {
565 pub fn user_id(&self) -> &UserId {
567 match self {
568 UserIdentityData::Own(i) => i.user_id(),
569 UserIdentityData::Other(i) => i.user_id(),
570 }
571 }
572
573 pub fn master_key(&self) -> &MasterPubkey {
575 match self {
576 UserIdentityData::Own(i) => i.master_key(),
577 UserIdentityData::Other(i) => i.master_key(),
578 }
579 }
580
581 pub fn self_signing_key(&self) -> &SelfSigningPubkey {
583 match self {
584 UserIdentityData::Own(i) => &i.self_signing_key,
585 UserIdentityData::Other(i) => &i.self_signing_key,
586 }
587 }
588
589 pub fn user_signing_key(&self) -> Option<&UserSigningPubkey> {
592 match self {
593 UserIdentityData::Own(i) => Some(&i.user_signing_key),
594 UserIdentityData::Other(_) => None,
595 }
596 }
597
598 pub fn was_previously_verified(&self) -> bool {
603 match self {
604 UserIdentityData::Own(i) => i.was_previously_verified(),
605 UserIdentityData::Other(i) => i.was_previously_verified(),
606 }
607 }
608
609 pub fn own(&self) -> Option<&OwnUserIdentityData> {
612 as_variant!(self, Self::Own)
613 }
614
615 pub(crate) fn into_own(self) -> Option<OwnUserIdentityData> {
618 as_variant!(self, Self::Own)
619 }
620
621 pub fn other(&self) -> Option<&OtherUserIdentityData> {
624 as_variant!(self, Self::Other)
625 }
626}
627
628#[derive(Debug, Clone, Deserialize, Serialize)]
652#[serde(try_from = "OtherUserIdentityDataSerializer", into = "OtherUserIdentityDataSerializer")]
653pub struct OtherUserIdentityData {
654 user_id: OwnedUserId,
655 pub(crate) master_key: Arc<MasterPubkey>,
656 self_signing_key: Arc<SelfSigningPubkey>,
657 pinned_master_key: Arc<RwLock<MasterPubkey>>,
658 previously_verified: Arc<AtomicBool>,
663}
664
665#[derive(Deserialize, Serialize)]
671struct OtherUserIdentityDataSerializer {
672 version: Option<String>,
673 #[serde(flatten)]
674 other: Value,
675}
676
677#[derive(Debug, Deserialize, Serialize)]
678struct OtherUserIdentityDataSerializerV0 {
679 user_id: OwnedUserId,
680 master_key: MasterPubkey,
681 self_signing_key: SelfSigningPubkey,
682}
683
684#[derive(Debug, Deserialize, Serialize)]
685struct OtherUserIdentityDataSerializerV1 {
686 user_id: OwnedUserId,
687 master_key: MasterPubkey,
688 self_signing_key: SelfSigningPubkey,
689 pinned_master_key: MasterPubkey,
690}
691
692#[derive(Debug, Deserialize, Serialize)]
693struct OtherUserIdentityDataSerializerV2 {
694 user_id: OwnedUserId,
695 master_key: MasterPubkey,
696 self_signing_key: SelfSigningPubkey,
697 pinned_master_key: MasterPubkey,
698 previously_verified: bool,
699}
700
701impl TryFrom<OtherUserIdentityDataSerializer> for OtherUserIdentityData {
702 type Error = serde_json::Error;
703 fn try_from(
704 value: OtherUserIdentityDataSerializer,
705 ) -> Result<OtherUserIdentityData, Self::Error> {
706 match value.version {
707 None => {
708 let v0: OtherUserIdentityDataSerializerV0 = serde_json::from_value(value.other)?;
710 Ok(OtherUserIdentityData {
711 user_id: v0.user_id,
712 master_key: Arc::new(v0.master_key.clone()),
713 self_signing_key: Arc::new(v0.self_signing_key),
714 pinned_master_key: Arc::new(RwLock::new(v0.master_key)),
716 previously_verified: Arc::new(false.into()),
717 })
718 }
719 Some(v) if v == "1" => {
720 let v1: OtherUserIdentityDataSerializerV1 = serde_json::from_value(value.other)?;
721 Ok(OtherUserIdentityData {
722 user_id: v1.user_id,
723 master_key: Arc::new(v1.master_key.clone()),
724 self_signing_key: Arc::new(v1.self_signing_key),
725 pinned_master_key: Arc::new(RwLock::new(v1.pinned_master_key)),
726 previously_verified: Arc::new(false.into()),
729 })
730 }
731 Some(v) if v == "2" => {
732 let v2: OtherUserIdentityDataSerializerV2 = serde_json::from_value(value.other)?;
733 Ok(OtherUserIdentityData {
734 user_id: v2.user_id,
735 master_key: Arc::new(v2.master_key.clone()),
736 self_signing_key: Arc::new(v2.self_signing_key),
737 pinned_master_key: Arc::new(RwLock::new(v2.pinned_master_key)),
738 previously_verified: Arc::new(v2.previously_verified.into()),
739 })
740 }
741 _ => Err(serde::de::Error::custom(format!("Unsupported Version {:?}", value.version))),
742 }
743 }
744}
745
746impl From<OtherUserIdentityData> for OtherUserIdentityDataSerializer {
747 fn from(value: OtherUserIdentityData) -> Self {
748 let v2 = OtherUserIdentityDataSerializerV2 {
749 user_id: value.user_id.clone(),
750 master_key: value.master_key().to_owned(),
751 self_signing_key: value.self_signing_key().to_owned(),
752 pinned_master_key: value.pinned_master_key.read().clone(),
753 previously_verified: value.previously_verified.load(Ordering::SeqCst),
754 };
755 OtherUserIdentityDataSerializer {
756 version: Some("2".to_owned()),
757 other: serde_json::to_value(v2).unwrap(),
758 }
759 }
760}
761
762impl PartialEq for OtherUserIdentityData {
763 fn eq(&self, other: &Self) -> bool {
776 self.user_id == other.user_id
777 && self.master_key == other.master_key
778 && self.self_signing_key == other.self_signing_key
779 && self.master_key.signatures() == other.master_key.signatures()
780 }
781}
782
783impl OtherUserIdentityData {
784 pub(crate) fn new(
795 master_key: MasterPubkey,
796 self_signing_key: SelfSigningPubkey,
797 ) -> Result<Self, SignatureError> {
798 master_key.verify_subkey(&self_signing_key)?;
799
800 Ok(Self {
801 user_id: master_key.user_id().into(),
802 master_key: master_key.clone().into(),
803 self_signing_key: self_signing_key.into(),
804 pinned_master_key: RwLock::new(master_key).into(),
805 previously_verified: Arc::new(false.into()),
806 })
807 }
808
809 #[cfg(test)]
810 pub(crate) async fn from_private(identity: &crate::olm::PrivateCrossSigningIdentity) -> Self {
811 let master_key = identity.master_key.lock().await.as_ref().unwrap().public_key().clone();
812 let self_signing_key =
813 identity.self_signing_key.lock().await.as_ref().unwrap().public_key().clone().into();
814
815 Self {
816 user_id: identity.user_id().into(),
817 master_key: Arc::new(master_key.clone()),
818 self_signing_key,
819 pinned_master_key: Arc::new(RwLock::new(master_key.clone())),
820 previously_verified: Arc::new(false.into()),
821 }
822 }
823
824 pub fn user_id(&self) -> &UserId {
826 &self.user_id
827 }
828
829 pub fn master_key(&self) -> &MasterPubkey {
831 &self.master_key
832 }
833
834 pub fn self_signing_key(&self) -> &SelfSigningPubkey {
836 &self.self_signing_key
837 }
838
839 pub(crate) fn pin(&self) {
855 let mut m = self.pinned_master_key.write();
856 *m = self.master_key.as_ref().clone()
857 }
858
859 pub(crate) fn mark_as_previously_verified(&self) {
861 self.previously_verified.store(true, Ordering::SeqCst)
862 }
863
864 pub fn was_previously_verified(&self) -> bool {
870 self.previously_verified.load(Ordering::SeqCst)
871 }
872
873 pub fn withdraw_verification(&self) {
879 self.pin();
882 self.previously_verified.store(false, Ordering::SeqCst)
883 }
884
885 pub(crate) fn has_pin_violation(&self) -> bool {
896 let pinned_master_key = self.pinned_master_key.read();
897 pinned_master_key.get_first_key() != self.master_key().get_first_key()
898 }
899
900 pub(crate) fn update(
915 &mut self,
916 master_key: MasterPubkey,
917 self_signing_key: SelfSigningPubkey,
918 maybe_verified_own_user_signing_key: Option<&UserSigningPubkey>,
919 ) -> Result<bool, SignatureError> {
920 master_key.verify_subkey(&self_signing_key)?;
921
922 let pinned_master_key = self.pinned_master_key.read().clone();
927
928 let updated_is_verified =
931 maybe_verified_own_user_signing_key.is_some_and(|own_user_signing_key| {
932 own_user_signing_key.verify_master_key(&master_key).is_ok()
933 });
934
935 let new = Self {
936 user_id: master_key.user_id().into(),
937 master_key: master_key.clone().into(),
938 self_signing_key: self_signing_key.into(),
939 pinned_master_key: RwLock::new(pinned_master_key).into(),
940 previously_verified: Arc::new(
941 (self.was_previously_verified() || updated_is_verified).into(),
942 ),
943 };
944 let changed = new != *self;
945
946 *self = new;
947 Ok(changed)
948 }
949
950 pub(crate) fn is_device_signed(&self, device: &DeviceData) -> bool {
962 self.user_id() == device.user_id() && self.self_signing_key.verify_device(device).is_ok()
963 }
964}
965
966#[derive(Debug, Clone, Serialize, Deserialize)]
974pub struct OwnUserIdentityData {
975 user_id: OwnedUserId,
976 master_key: Arc<MasterPubkey>,
977 self_signing_key: Arc<SelfSigningPubkey>,
978 user_signing_key: Arc<UserSigningPubkey>,
979 #[serde(deserialize_with = "deserialize_own_user_identity_data_verified")]
980 verified: Arc<RwLock<OwnUserIdentityVerifiedState>>,
981}
982
983#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
984enum OwnUserIdentityVerifiedState {
985 #[default]
987 NeverVerified,
988
989 #[serde(alias = "PreviouslyVerifiedButNoLonger")]
991 VerificationViolation,
992
993 Verified,
995}
996
997impl PartialEq for OwnUserIdentityData {
998 fn eq(&self, other: &Self) -> bool {
1011 self.user_id == other.user_id
1012 && self.master_key == other.master_key
1013 && self.self_signing_key == other.self_signing_key
1014 && self.user_signing_key == other.user_signing_key
1015 && *self.verified.read() == *other.verified.read()
1016 && self.master_key.signatures() == other.master_key.signatures()
1017 }
1018}
1019
1020impl OwnUserIdentityData {
1021 pub(crate) fn new(
1035 master_key: MasterPubkey,
1036 self_signing_key: SelfSigningPubkey,
1037 user_signing_key: UserSigningPubkey,
1038 ) -> Result<Self, SignatureError> {
1039 master_key.verify_subkey(&self_signing_key)?;
1040 master_key.verify_subkey(&user_signing_key)?;
1041
1042 Ok(Self {
1043 user_id: master_key.user_id().into(),
1044 master_key: master_key.into(),
1045 self_signing_key: self_signing_key.into(),
1046 user_signing_key: user_signing_key.into(),
1047 verified: Default::default(),
1048 })
1049 }
1050
1051 #[cfg(test)]
1052 pub(crate) async fn from_private(identity: &crate::olm::PrivateCrossSigningIdentity) -> Self {
1053 let master_key = identity.master_key.lock().await.as_ref().unwrap().public_key().clone();
1054 let self_signing_key =
1055 identity.self_signing_key.lock().await.as_ref().unwrap().public_key().clone();
1056 let user_signing_key =
1057 identity.user_signing_key.lock().await.as_ref().unwrap().public_key().clone();
1058
1059 Self {
1060 user_id: identity.user_id().into(),
1061 master_key: master_key.into(),
1062 self_signing_key: self_signing_key.into(),
1063 user_signing_key: user_signing_key.into(),
1064 verified: Default::default(),
1065 }
1066 }
1067
1068 pub fn user_id(&self) -> &UserId {
1070 &self.user_id
1071 }
1072
1073 pub fn master_key(&self) -> &MasterPubkey {
1075 &self.master_key
1076 }
1077
1078 pub fn self_signing_key(&self) -> &SelfSigningPubkey {
1080 &self.self_signing_key
1081 }
1082
1083 pub fn user_signing_key(&self) -> &UserSigningPubkey {
1085 &self.user_signing_key
1086 }
1087
1088 pub fn is_identity_verified(&self, identity: &OtherUserIdentityData) -> bool {
1099 self.is_verified() && self.is_identity_signed(identity)
1100 }
1101
1102 pub(crate) fn is_identity_signed(&self, identity: &OtherUserIdentityData) -> bool {
1115 self.user_signing_key.verify_master_key(&identity.master_key).is_ok()
1116 }
1117
1118 pub(crate) fn is_device_signed(&self, device: &DeviceData) -> bool {
1130 self.user_id() == device.user_id() && self.self_signing_key.verify_device(device).is_ok()
1131 }
1132
1133 pub fn mark_as_verified(&self) {
1135 *self.verified.write() = OwnUserIdentityVerifiedState::Verified;
1136 }
1137
1138 pub(crate) fn mark_as_unverified(&self) {
1140 let mut guard = self.verified.write();
1141 if *guard == OwnUserIdentityVerifiedState::Verified {
1142 *guard = OwnUserIdentityVerifiedState::VerificationViolation;
1143 }
1144 }
1145
1146 pub fn is_verified(&self) -> bool {
1148 *self.verified.read() == OwnUserIdentityVerifiedState::Verified
1149 }
1150
1151 pub fn was_previously_verified(&self) -> bool {
1156 matches!(
1157 *self.verified.read(),
1158 OwnUserIdentityVerifiedState::Verified
1159 | OwnUserIdentityVerifiedState::VerificationViolation
1160 )
1161 }
1162
1163 pub fn withdraw_verification(&self) {
1169 let mut guard = self.verified.write();
1170 if *guard == OwnUserIdentityVerifiedState::VerificationViolation {
1171 *guard = OwnUserIdentityVerifiedState::NeverVerified;
1172 }
1173 }
1174
1175 pub fn has_verification_violation(&self) -> bool {
1185 *self.verified.read() == OwnUserIdentityVerifiedState::VerificationViolation
1186 }
1187
1188 pub(crate) fn update(
1204 &mut self,
1205 master_key: MasterPubkey,
1206 self_signing_key: SelfSigningPubkey,
1207 user_signing_key: UserSigningPubkey,
1208 ) -> Result<bool, SignatureError> {
1209 master_key.verify_subkey(&self_signing_key)?;
1210 master_key.verify_subkey(&user_signing_key)?;
1211
1212 let old = self.clone();
1213
1214 self.self_signing_key = self_signing_key.into();
1215 self.user_signing_key = user_signing_key.into();
1216
1217 if self.master_key.as_ref() != &master_key {
1218 self.mark_as_unverified()
1219 }
1220
1221 self.master_key = master_key.into();
1222
1223 Ok(old != *self)
1224 }
1225
1226 fn filter_devices_to_request(
1227 &self,
1228 devices: HashMap<OwnedDeviceId, DeviceData>,
1229 own_device_id: &DeviceId,
1230 ) -> Vec<OwnedDeviceId> {
1231 devices
1232 .into_iter()
1233 .filter_map(|(device_id, device)| {
1234 (device_id != own_device_id && self.is_device_signed(&device)).then_some(device_id)
1235 })
1236 .collect()
1237 }
1238}
1239
1240fn deserialize_own_user_identity_data_verified<'de, D>(
1244 de: D,
1245) -> Result<Arc<RwLock<OwnUserIdentityVerifiedState>>, D::Error>
1246where
1247 D: Deserializer<'de>,
1248{
1249 #[derive(Deserialize)]
1250 #[serde(untagged)]
1251 enum VerifiedStateOrBool {
1252 VerifiedState(OwnUserIdentityVerifiedState),
1253 Bool(bool),
1254 }
1255
1256 let verified_state = match VerifiedStateOrBool::deserialize(de)? {
1257 VerifiedStateOrBool::Bool(true) => OwnUserIdentityVerifiedState::Verified,
1258 VerifiedStateOrBool::Bool(false) => OwnUserIdentityVerifiedState::NeverVerified,
1259 VerifiedStateOrBool::VerifiedState(x) => x,
1260 };
1261
1262 Ok(Arc::new(RwLock::new(verified_state)))
1263}
1264
1265#[cfg(any(test, feature = "testing"))]
1267#[allow(dead_code)]
1268pub(crate) mod testing {
1269 use matrix_sdk_test::ruma_response_from_json;
1270 use ruma::{
1271 UserId,
1272 api::client::keys::{
1273 get_keys::v3::Response as KeyQueryResponse,
1274 upload_signatures::v3::Request as SignatureUploadRequest,
1275 },
1276 user_id,
1277 };
1278 use serde_json::json;
1279
1280 use super::{OtherUserIdentityData, OwnUserIdentity, OwnUserIdentityData};
1281 #[cfg(test)]
1282 use crate::{identities::manager::testing::other_user_id, olm::PrivateCrossSigningIdentity};
1283 use crate::{
1284 identities::{
1285 DeviceData,
1286 manager::testing::{other_key_query, own_key_query},
1287 },
1288 store::Store,
1289 types::CrossSigningKey,
1290 verification::VerificationMachine,
1291 };
1292
1293 pub fn device(response: &KeyQueryResponse) -> (DeviceData, DeviceData) {
1295 let mut devices = response.device_keys.values().next().unwrap().values();
1296 let first =
1297 DeviceData::try_from(&devices.next().unwrap().deserialize_as().unwrap()).unwrap();
1298 let second =
1299 DeviceData::try_from(&devices.next().unwrap().deserialize_as().unwrap()).unwrap();
1300 (first, second)
1301 }
1302
1303 pub fn own_identity(response: &KeyQueryResponse) -> OwnUserIdentityData {
1305 let user_id = user_id!("@example:localhost");
1306
1307 let master_key: CrossSigningKey =
1308 response.master_keys.get(user_id).unwrap().deserialize_as().unwrap();
1309 let user_signing: CrossSigningKey =
1310 response.user_signing_keys.get(user_id).unwrap().deserialize_as().unwrap();
1311 let self_signing: CrossSigningKey =
1312 response.self_signing_keys.get(user_id).unwrap().deserialize_as().unwrap();
1313
1314 OwnUserIdentityData::new(
1315 master_key.try_into().unwrap(),
1316 self_signing.try_into().unwrap(),
1317 user_signing.try_into().unwrap(),
1318 )
1319 .unwrap()
1320 }
1321
1322 pub fn get_own_identity() -> OwnUserIdentityData {
1324 own_identity(&own_key_query())
1325 }
1326
1327 pub fn own_identity_wrapped(
1328 inner: OwnUserIdentityData,
1329 verification_machine: VerificationMachine,
1330 store: Store,
1331 ) -> OwnUserIdentity {
1332 OwnUserIdentity { inner, verification_machine, store }
1333 }
1334
1335 #[cfg(test)]
1337 pub async fn get_other_own_identity() -> OwnUserIdentityData {
1338 let private_identity = PrivateCrossSigningIdentity::new(other_user_id().into());
1339 OwnUserIdentityData::from_private(&private_identity).await
1340 }
1341
1342 pub fn get_other_identity() -> OtherUserIdentityData {
1344 let user_id = user_id!("@example2:localhost");
1345 let response = other_key_query();
1346
1347 let master_key: CrossSigningKey =
1348 response.master_keys.get(user_id).unwrap().deserialize_as().unwrap();
1349 let self_signing: CrossSigningKey =
1350 response.self_signing_keys.get(user_id).unwrap().deserialize_as().unwrap();
1351
1352 OtherUserIdentityData::new(master_key.try_into().unwrap(), self_signing.try_into().unwrap())
1353 .unwrap()
1354 }
1355
1356 pub fn simulate_key_query_response_for_verification(
1409 signature_upload_request: SignatureUploadRequest,
1410 my_identity: OwnUserIdentity,
1411 my_user_id: &UserId,
1412 their_user_id: &UserId,
1413 msk_json: serde_json::Value,
1414 ssk_json: serde_json::Value,
1415 ) -> KeyQueryResponse {
1416 let cross_signing_key: CrossSigningKey = serde_json::from_str(
1418 signature_upload_request
1419 .signed_keys
1420 .get(their_user_id)
1421 .expect("Signature upload request should contain a key for their user ID")
1422 .iter()
1423 .next()
1424 .expect("There should be a key in the signature upload request")
1425 .1
1426 .get(),
1427 )
1428 .expect("Should not fail to deserialize the key");
1429
1430 let mut their_msk: CrossSigningKey = serde_json::from_value(
1432 msk_json.get(their_user_id.as_str()).expect("msk should contain their user ID").clone(),
1433 )
1434 .expect("Should not fail to deserialize msk");
1435
1436 let my_user_signing_key_id = my_identity
1438 .user_signing_key()
1439 .keys()
1440 .iter()
1441 .next()
1442 .expect("There should be a user signing key")
1443 .0;
1444
1445 their_msk.signatures.add_signature(
1448 my_user_id.to_owned(),
1449 my_user_signing_key_id.to_owned(),
1450 cross_signing_key
1451 .signatures
1452 .get_signature(my_user_id, my_user_signing_key_id)
1453 .expect("There should be a signature for our user"),
1454 );
1455
1456 ruma_response_from_json(&json!({
1458 "device_keys": {}, "failures": {},
1460 "master_keys": {
1461 their_user_id: their_msk,
1462 },
1463 "self_signing_keys": ssk_json,
1464 }))
1465 }
1466}
1467
1468#[cfg(test)]
1469pub(crate) mod tests {
1470 use std::{collections::HashMap, sync::Arc};
1471
1472 use assert_matches::assert_matches;
1473 use matrix_sdk_test::{async_test, test_json};
1474 #[cfg(feature = "experimental-x509-identity-verification")]
1475 use rcgen::{Certificate, KeyPair};
1476 use ruma::{TransactionId, device_id, user_id};
1477 use serde_json::{Value, json};
1478 use tokio::sync::Mutex;
1479
1480 use super::{
1481 OtherUserIdentityDataSerializerV2, OwnUserIdentityData, OwnUserIdentityVerifiedState,
1482 UserIdentityData,
1483 testing::{device, get_other_identity, get_own_identity},
1484 };
1485 use crate::{
1486 CrossSigningKeyExport, OlmMachine, OtherUserIdentity, OtherUserIdentityData,
1487 identities::{
1488 Device,
1489 manager::testing::own_key_query,
1490 user::{
1491 OtherUserIdentityDataSerializer,
1492 testing::simulate_key_query_response_for_verification,
1493 },
1494 },
1495 olm::{Account, PrivateCrossSigningIdentity},
1496 store::{CryptoStoreWrapper, MemoryStore},
1497 types::{CrossSigningKey, MasterPubkey, SelfSigningPubkey, Signatures, UserSigningPubkey},
1498 verification::VerificationMachine,
1499 };
1500 #[cfg(feature = "experimental-x509-identity-verification")]
1501 use crate::{
1502 store::Store,
1503 x509::{
1504 RustRawX509Signer, RustRawX509Verifier, X509Signer, X509Verifier,
1505 tests::{
1506 ca_cert, cert_and_key_with_email_in_subject_distinguished_name,
1507 cert_and_key_with_email_signed_by, create_rust_signer_and_verifier,
1508 },
1509 },
1510 };
1511
1512 #[test]
1513 fn own_identity_create() {
1514 let user_id = user_id!("@example:localhost");
1515 let response = own_key_query();
1516
1517 let master_key: CrossSigningKey =
1518 response.master_keys.get(user_id).unwrap().deserialize_as().unwrap();
1519 let user_signing: CrossSigningKey =
1520 response.user_signing_keys.get(user_id).unwrap().deserialize_as().unwrap();
1521 let self_signing: CrossSigningKey =
1522 response.self_signing_keys.get(user_id).unwrap().deserialize_as().unwrap();
1523
1524 OwnUserIdentityData::new(
1525 master_key.try_into().unwrap(),
1526 self_signing.try_into().unwrap(),
1527 user_signing.try_into().unwrap(),
1528 )
1529 .unwrap();
1530 }
1531
1532 #[test]
1533 fn own_identity_partial_equality() {
1534 let user_id = user_id!("@example:localhost");
1535 let response = own_key_query();
1536
1537 let master_key: CrossSigningKey =
1538 response.master_keys.get(user_id).unwrap().deserialize_as().unwrap();
1539 let user_signing: CrossSigningKey =
1540 response.user_signing_keys.get(user_id).unwrap().deserialize_as().unwrap();
1541 let self_signing: CrossSigningKey =
1542 response.self_signing_keys.get(user_id).unwrap().deserialize_as().unwrap();
1543
1544 let identity = OwnUserIdentityData::new(
1545 master_key.clone().try_into().unwrap(),
1546 self_signing.clone().try_into().unwrap(),
1547 user_signing.clone().try_into().unwrap(),
1548 )
1549 .unwrap();
1550
1551 let mut master_key_updated_signature = master_key;
1552 master_key_updated_signature.signatures = Signatures::new();
1553
1554 let updated_identity = OwnUserIdentityData::new(
1555 master_key_updated_signature.try_into().unwrap(),
1556 self_signing.try_into().unwrap(),
1557 user_signing.try_into().unwrap(),
1558 )
1559 .unwrap();
1560
1561 assert_ne!(identity, updated_identity);
1562 assert_eq!(identity.master_key(), updated_identity.master_key());
1563 }
1564
1565 #[test]
1566 fn other_identity_create() {
1567 get_other_identity();
1568 }
1569
1570 #[test]
1571 fn deserialization_migration_test() {
1572 let serialized_value = json!({
1573 "user_id":"@example2:localhost",
1574 "master_key":{
1575 "user_id":"@example2:localhost",
1576 "usage":[
1577 "master"
1578 ],
1579 "keys":{
1580 "ed25519:kC/HmRYw4HNqUp/i4BkwYENrf+hd9tvdB7A1YOf5+Do":"kC/HmRYw4HNqUp/i4BkwYENrf+hd9tvdB7A1YOf5+Do"
1581 },
1582 "signatures":{
1583 "@example2:localhost":{
1584 "ed25519:SKISMLNIMH":"KdUZqzt8VScGNtufuQ8lOf25byYLWIhmUYpPENdmM8nsldexD7vj+Sxoo7PknnTX/BL9h2N7uBq0JuykjunCAw"
1585 }
1586 }
1587 },
1588 "self_signing_key":{
1589 "user_id":"@example2:localhost",
1590 "usage":[
1591 "self_signing"
1592 ],
1593 "keys":{
1594 "ed25519:ZtFrSkJ1qB8Jph/ql9Eo/lKpIYCzwvKAKXfkaS4XZNc":"ZtFrSkJ1qB8Jph/ql9Eo/lKpIYCzwvKAKXfkaS4XZNc"
1595 },
1596 "signatures":{
1597 "@example2:localhost":{
1598 "ed25519:kC/HmRYw4HNqUp/i4BkwYENrf+hd9tvdB7A1YOf5+Do":"W/O8BnmiUETPpH02mwYaBgvvgF/atXnusmpSTJZeUSH/vHg66xiZOhveQDG4cwaW8iMa+t9N4h1DWnRoHB4mCQ"
1599 }
1600 }
1601 }
1602 });
1603 let migrated: OtherUserIdentityData = serde_json::from_value(serialized_value).unwrap();
1604
1605 let pinned_master_key = migrated.pinned_master_key.read();
1606 assert_eq!(*pinned_master_key, migrated.master_key().clone());
1607
1608 let value = serde_json::to_value(migrated.clone()).unwrap();
1610
1611 let _: OtherUserIdentityDataSerializerV2 =
1613 serde_json::from_value(value.clone()).expect("Should deserialize as version 2");
1614
1615 let with_serializer: OtherUserIdentityDataSerializer =
1616 serde_json::from_value(value).unwrap();
1617 assert_eq!("2", with_serializer.version.unwrap());
1618 }
1619
1620 #[test]
1623 fn test_deserialize_own_user_identity_bool_verified() {
1624 let mut json = own_user_identity_data();
1625
1626 *json.get_mut("verified").unwrap() = false.into();
1628 let id: OwnUserIdentityData = serde_json::from_value(json.clone()).unwrap();
1629 assert_eq!(*id.verified.read(), OwnUserIdentityVerifiedState::NeverVerified);
1630
1631 *json.get_mut("verified").unwrap() = true.into();
1633 let id: OwnUserIdentityData = serde_json::from_value(json.clone()).unwrap();
1634 assert_eq!(*id.verified.read(), OwnUserIdentityVerifiedState::Verified);
1635 }
1636
1637 #[test]
1638 fn test_own_user_identity_verified_state_verification_violation_deserializes() {
1639 let mut json = own_user_identity_data();
1641 *json.get_mut("verified").unwrap() = "VerificationViolation".into();
1642
1643 let id: OwnUserIdentityData = serde_json::from_value(json.clone()).unwrap();
1645
1646 assert_eq!(*id.verified.read(), OwnUserIdentityVerifiedState::VerificationViolation);
1648 }
1649
1650 #[test]
1651 fn test_own_user_identity_verified_state_previously_verified_deserializes() {
1652 let mut json = own_user_identity_data();
1654 *json.get_mut("verified").unwrap() = "PreviouslyVerifiedButNoLonger".into();
1655
1656 let id: OwnUserIdentityData = serde_json::from_value(json.clone()).unwrap();
1658
1659 assert_eq!(*id.verified.read(), OwnUserIdentityVerifiedState::VerificationViolation);
1661 }
1662
1663 #[test]
1664 fn own_identity_check_signatures() {
1665 let response = own_key_query();
1666 let identity = get_own_identity();
1667 let (first, second) = device(&response);
1668
1669 assert!(!identity.is_device_signed(&first));
1670 assert!(identity.is_device_signed(&second));
1671
1672 let account = Account::with_device_id(second.user_id(), second.device_id());
1673 let verification_machine = get_verification_machine(&account);
1674
1675 let first = Device {
1676 inner: first,
1677 verification_machine: verification_machine.clone(),
1678 own_identity: Some(identity.clone()),
1679 device_owner_identity: Some(UserIdentityData::Own(identity.clone())),
1680 };
1681
1682 let second = Device {
1683 inner: second,
1684 verification_machine,
1685 own_identity: Some(identity.clone()),
1686 device_owner_identity: Some(UserIdentityData::Own(identity.clone())),
1687 };
1688
1689 assert!(!second.is_locally_trusted());
1690 assert!(!second.is_cross_signing_trusted());
1691
1692 assert!(!first.is_locally_trusted());
1693 assert!(!first.is_cross_signing_trusted());
1694
1695 identity.mark_as_verified();
1696 assert!(second.is_verified());
1697 assert!(!first.is_verified());
1698 }
1699
1700 #[async_test]
1701 async fn test_own_device_with_private_identity() {
1702 let response = own_key_query();
1703 let (_, device) = device(&response);
1704
1705 let account = Account::with_device_id(device.user_id(), device.device_id());
1706 let verification_machine = get_verification_machine(&account);
1707 let public_identity = verification_machine.get_own_user_identity_data().await.unwrap();
1708
1709 let mut device = Device {
1710 inner: device,
1711 verification_machine: verification_machine.clone(),
1712 own_identity: Some(public_identity.clone()),
1713 device_owner_identity: Some(public_identity.clone().into()),
1714 };
1715
1716 assert!(!device.is_verified());
1717
1718 let mut device_keys = device.as_device_keys().to_owned();
1719
1720 let identity = verification_machine.store.private_identity.lock().await;
1721 identity.sign_device_keys(&mut device_keys).await.unwrap();
1722 device.inner.update_device(&device_keys).expect("Couldn't update newly signed device keys");
1723 assert!(device.is_verified());
1724 }
1725
1726 #[test]
1730 fn cannot_instantiate_keys_with_incorrect_usage() {
1731 let user_id = user_id!("@example:localhost");
1732 let response = own_key_query();
1733
1734 let master_key = response.master_keys.get(user_id).unwrap();
1735 let mut master_key_json: Value = master_key.deserialize_as().unwrap();
1736 let self_signing_key = response.self_signing_keys.get(user_id).unwrap();
1737 let mut self_signing_key_json: Value = self_signing_key.deserialize_as().unwrap();
1738 let user_signing_key = response.user_signing_keys.get(user_id).unwrap();
1739 let mut user_signing_key_json: Value = user_signing_key.deserialize_as().unwrap();
1740
1741 let usage = master_key_json.get_mut("usage").unwrap();
1743 *usage = json!([]);
1744 let usage = self_signing_key_json.get_mut("usage").unwrap();
1745 *usage = json!([]);
1746 let usage = user_signing_key_json.get_mut("usage").unwrap();
1747 *usage = json!([]);
1748
1749 assert_matches!(serde_json::from_value::<MasterPubkey>(master_key_json.clone()), Err(_));
1752 assert_matches!(
1753 serde_json::from_value::<SelfSigningPubkey>(self_signing_key_json.clone()),
1754 Err(_)
1755 );
1756 assert_matches!(
1757 serde_json::from_value::<UserSigningPubkey>(user_signing_key_json.clone()),
1758 Err(_)
1759 );
1760
1761 let usage = master_key_json.get_mut("usage").unwrap();
1763 *usage = json!(["master", "user_signing"]);
1764 let usage = self_signing_key_json.get_mut("usage").unwrap();
1765 *usage = json!(["self_signing", "user_signing"]);
1766 let usage = user_signing_key_json.get_mut("usage").unwrap();
1767 *usage = json!(["user_signing", "self_signing"]);
1768
1769 assert_matches!(serde_json::from_value::<MasterPubkey>(master_key_json.clone()), Err(_));
1772 assert_matches!(
1773 serde_json::from_value::<SelfSigningPubkey>(self_signing_key_json.clone()),
1774 Err(_)
1775 );
1776 assert_matches!(
1777 serde_json::from_value::<UserSigningPubkey>(user_signing_key_json.clone()),
1778 Err(_)
1779 );
1780 }
1781
1782 #[test]
1783 fn filter_devices_to_request() {
1784 let response = own_key_query();
1785 let identity = get_own_identity();
1786 let (first, second) = device(&response);
1787
1788 let second_device_id = second.device_id().to_owned();
1789 let unknown_device_id = device_id!("UNKNOWN");
1790
1791 let devices = HashMap::from([
1792 (first.device_id().to_owned(), first),
1793 (second.device_id().to_owned(), second),
1794 ]);
1795
1796 assert_eq!(identity.filter_devices_to_request(devices.clone(), &second_device_id).len(), 0);
1798 assert_eq!(
1800 identity.filter_devices_to_request(devices, unknown_device_id),
1801 [second_device_id]
1802 );
1803 }
1804
1805 #[async_test]
1806 async fn test_resolve_identity_pin_violation_with_verification() {
1807 use test_json::keys_query_sets::IdentityChangeDataSet as DataSet;
1808
1809 let my_user_id = user_id!("@me:localhost");
1810 let machine = OlmMachine::new(my_user_id, device_id!("ABCDEFGH")).await;
1811 machine.bootstrap_cross_signing(false).await.unwrap();
1812
1813 let my_id = machine.get_identity(my_user_id, None).await.unwrap().unwrap().own().unwrap();
1814
1815 let keys_query = DataSet::key_query_with_identity_a();
1816 let txn_id = TransactionId::new();
1817 machine.mark_request_as_sent(&txn_id, &keys_query).await.unwrap();
1818
1819 let keys_query = DataSet::key_query_with_identity_b();
1821 let txn_id = TransactionId::new();
1822 machine.mark_request_as_sent(&txn_id, &keys_query).await.unwrap();
1823
1824 let other_user_id = DataSet::user_id();
1825
1826 let other_identity =
1827 machine.get_identity(other_user_id, None).await.unwrap().unwrap().other().unwrap();
1828
1829 assert!(other_identity.identity_needs_user_approval());
1831
1832 let sig_upload = other_identity.verify().await.unwrap();
1834
1835 let kq_response = simulate_key_query_response_for_verification(
1836 sig_upload,
1837 my_id,
1838 my_user_id,
1839 other_user_id,
1840 DataSet::master_signing_keys_b(),
1841 DataSet::self_signing_keys_b(),
1842 );
1843 machine.mark_request_as_sent(&TransactionId::new(), &kq_response).await.unwrap();
1844
1845 let other_identity =
1847 machine.get_identity(other_user_id, None).await.unwrap().unwrap().other().unwrap();
1848 assert!(!other_identity.identity_needs_user_approval());
1849 assert!(other_identity.inner.has_pin_violation());
1851 }
1852
1853 #[async_test]
1854 async fn test_resolve_identity_pin_violation_with_withdraw_verification() {
1855 use test_json::keys_query_sets::IdentityChangeDataSet as DataSet;
1856
1857 let my_user_id = user_id!("@me:localhost");
1858 let machine = OlmMachine::new(my_user_id, device_id!("ABCDEFGH")).await;
1859 machine.bootstrap_cross_signing(false).await.unwrap();
1860
1861 let keys_query = DataSet::key_query_with_identity_a();
1862 let txn_id = TransactionId::new();
1863 machine.mark_request_as_sent(&txn_id, &keys_query).await.unwrap();
1864
1865 let keys_query = DataSet::key_query_with_identity_b();
1867 let txn_id = TransactionId::new();
1868 machine.mark_request_as_sent(&txn_id, &keys_query).await.unwrap();
1869
1870 let other_user_id = DataSet::user_id();
1871
1872 let other_identity =
1873 machine.get_identity(other_user_id, None).await.unwrap().unwrap().other().unwrap();
1874
1875 other_identity.mark_as_previously_verified().await.unwrap();
1877
1878 assert!(other_identity.identity_needs_user_approval());
1880
1881 other_identity.withdraw_verification().await.unwrap();
1883
1884 let other_identity =
1886 machine.get_identity(other_user_id, None).await.unwrap().unwrap().other().unwrap();
1887 assert!(!other_identity.identity_needs_user_approval());
1888 assert!(!other_identity.inner.has_pin_violation());
1890 }
1891
1892 #[async_test]
1893 async fn test_resolve_identity_verification_violation_with_withdraw() {
1894 use test_json::keys_query_sets::VerificationViolationTestData as DataSet;
1895
1896 let machine = OlmMachine::new(DataSet::own_id(), device_id!("LOCAL")).await;
1897
1898 let keys_query = DataSet::own_keys_query_response_1();
1899 let txn_id = TransactionId::new();
1900 machine.mark_request_as_sent(&txn_id, &keys_query).await.unwrap();
1901
1902 machine
1903 .import_cross_signing_keys(CrossSigningKeyExport {
1904 master_key: DataSet::MASTER_KEY_PRIVATE_EXPORT.to_owned().into(),
1905 self_signing_key: DataSet::SELF_SIGNING_KEY_PRIVATE_EXPORT.to_owned().into(),
1906 user_signing_key: DataSet::USER_SIGNING_KEY_PRIVATE_EXPORT.to_owned().into(),
1907 })
1908 .await
1909 .unwrap();
1910
1911 let keys_query = DataSet::bob_keys_query_response_rotated();
1912 let txn_id = TransactionId::new();
1913 machine.mark_request_as_sent(&txn_id, &keys_query).await.unwrap();
1914
1915 let bob_identity =
1916 machine.get_identity(DataSet::bob_id(), None).await.unwrap().unwrap().other().unwrap();
1917
1918 bob_identity.mark_as_previously_verified().await.unwrap();
1920
1921 assert!(bob_identity.has_verification_violation());
1922
1923 bob_identity.withdraw_verification().await.unwrap();
1925
1926 let bob_identity =
1927 machine.get_identity(DataSet::bob_id(), None).await.unwrap().unwrap().other().unwrap();
1928
1929 assert!(!bob_identity.has_verification_violation());
1930 }
1931
1932 #[async_test]
1933 async fn test_reset_own_keys_creates_verification_violation() {
1934 use test_json::keys_query_sets::VerificationViolationTestData as DataSet;
1935
1936 let machine = OlmMachine::new(DataSet::own_id(), device_id!("LOCAL")).await;
1937
1938 let keys_query = DataSet::own_keys_query_response_1();
1939 let txn_id = TransactionId::new();
1940 machine.mark_request_as_sent(&txn_id, &keys_query).await.unwrap();
1941
1942 machine
1943 .import_cross_signing_keys(CrossSigningKeyExport {
1944 master_key: DataSet::MASTER_KEY_PRIVATE_EXPORT.to_owned().into(),
1945 self_signing_key: DataSet::SELF_SIGNING_KEY_PRIVATE_EXPORT.to_owned().into(),
1946 user_signing_key: DataSet::USER_SIGNING_KEY_PRIVATE_EXPORT.to_owned().into(),
1947 })
1948 .await
1949 .unwrap();
1950
1951 let keys_query = DataSet::bob_keys_query_response_signed();
1952 let txn_id = TransactionId::new();
1953 machine.mark_request_as_sent(&txn_id, &keys_query).await.unwrap();
1954
1955 let bob_identity =
1956 machine.get_identity(DataSet::bob_id(), None).await.unwrap().unwrap().other().unwrap();
1957
1958 bob_identity.mark_as_previously_verified().await.unwrap();
1960
1961 assert!(!bob_identity.has_verification_violation());
1962
1963 let _ = machine.bootstrap_cross_signing(true).await.unwrap();
1964
1965 let bob_identity =
1966 machine.get_identity(DataSet::bob_id(), None).await.unwrap().unwrap().other().unwrap();
1967
1968 assert!(bob_identity.has_verification_violation());
1969 }
1970
1971 #[async_test]
1974 async fn test_own_keys_update_creates_own_identity_verification_violation() {
1975 use test_json::keys_query_sets::VerificationViolationTestData as DataSet;
1976
1977 let machine = OlmMachine::new(DataSet::own_id(), device_id!("LOCAL")).await;
1978
1979 let own_keys = DataSet::own_keys_query_response_1();
1981 machine.mark_request_as_sent(&TransactionId::new(), &own_keys).await.unwrap();
1982
1983 machine
1984 .import_cross_signing_keys(CrossSigningKeyExport {
1985 master_key: DataSet::MASTER_KEY_PRIVATE_EXPORT.to_owned().into(),
1986 self_signing_key: DataSet::SELF_SIGNING_KEY_PRIVATE_EXPORT.to_owned().into(),
1987 user_signing_key: DataSet::USER_SIGNING_KEY_PRIVATE_EXPORT.to_owned().into(),
1988 })
1989 .await
1990 .unwrap();
1991
1992 let own_identity = machine.get_identity(DataSet::own_id(), None).await.unwrap().unwrap();
1994 assert!(own_identity.is_verified());
1995 assert!(own_identity.was_previously_verified());
1996 assert!(!own_identity.has_verification_violation());
1997
1998 let own_keys = DataSet::own_keys_query_response_2();
2000 machine.mark_request_as_sent(&TransactionId::new(), &own_keys).await.unwrap();
2001
2002 let own_identity = machine.get_identity(DataSet::own_id(), None).await.unwrap().unwrap();
2005 assert!(!own_identity.is_verified());
2006 assert!(own_identity.was_previously_verified());
2007 assert!(own_identity.has_verification_violation());
2008
2009 own_identity.withdraw_verification().await.unwrap();
2012
2013 assert!(!own_identity.is_verified());
2014 assert!(!own_identity.was_previously_verified());
2015 assert!(!own_identity.has_verification_violation());
2016 }
2017
2018 fn own_user_identity_data() -> Value {
2019 json!({
2020 "user_id": "@example:localhost",
2021 "master_key": {
2022 "user_id":"@example:localhost",
2023 "usage":["master"],
2024 "keys":{"ed25519:rJ2TAGkEOP6dX41Ksll6cl8K3J48l8s/59zaXyvl2p0":"rJ2TAGkEOP6dX41Ksll6cl8K3J48l8s/59zaXyvl2p0"},
2025 },
2026 "self_signing_key": {
2027 "user_id":"@example:localhost",
2028 "usage":["self_signing"],
2029 "keys":{"ed25519:0C8lCBxrvrv/O7BQfsKnkYogHZX3zAgw3RfJuyiq210":"0C8lCBxrvrv/O7BQfsKnkYogHZX3zAgw3RfJuyiq210"}
2030 },
2031 "user_signing_key": {
2032 "user_id":"@example:localhost",
2033 "usage":["user_signing"],
2034 "keys":{"ed25519:DU9z4gBFKFKCk7a13sW9wjT0Iyg7Hqv5f0BPM7DEhPo":"DU9z4gBFKFKCk7a13sW9wjT0Iyg7Hqv5f0BPM7DEhPo"}
2035 },
2036 "verified": false
2037 })
2038 }
2039
2040 #[async_test]
2041 async fn test_other_user_identity_verification_request_content() {
2042 let other_user_identity = other_user_identity().await;
2043 let verification_request_content = other_user_identity.verification_request_content(None);
2044 let mut verification_request_content_json =
2045 serde_json::to_value(verification_request_content)
2046 .expect("Could not serialize verification request content");
2047
2048 let verification_request_content_object = verification_request_content_json
2050 .as_object_mut()
2051 .expect("serialized verification request was not an object");
2052 verification_request_content_object.remove("body").expect("No `body` in message content");
2053
2054 let methods = verification_request_content_object
2056 .remove("methods")
2057 .expect("No `methods` in message content");
2058 let methods = methods.as_array().expect("`methods` was not an array");
2059 assert!(methods.contains(&json!("m.sas.v1")));
2060 assert!(methods.contains(&json!("m.reciprocate.v1")));
2061
2062 assert_eq!(
2063 verification_request_content_json,
2064 json!({
2065 "msgtype": "m.key.verification.request",
2066 "from_device": "DEV123",
2067 "to": other_user_identity.user_id().to_string(),
2068 })
2069 );
2070 }
2071
2072 #[cfg(feature = "experimental-x509-identity-verification")]
2073 #[async_test]
2074 async fn test_sign_own_identity_with_x509() {
2075 let account =
2076 Account::with_device_id(user_id!("@own_user:localhost"), device_id!("DEV123"));
2077 let (cert, signing_key) =
2079 cert_and_key_with_email_in_subject_distinguished_name("own_user@localhost");
2080
2081 let (x509_signer, x509_verifier) = create_rust_signer_and_verifier(cert, signing_key);
2082
2083 let store = create_store_with_x509(account, x509_verifier.clone(), x509_signer).await;
2084
2085 let own_identity = store
2088 .get_identity(user_id!("@own_user:localhost"))
2089 .await
2090 .unwrap()
2091 .unwrap()
2092 .own()
2093 .unwrap();
2094 let signature_upload_request = own_identity.verify().await.unwrap();
2095 let (_, signed_key) = signature_upload_request
2096 .signed_keys
2097 .get(user_id!("@own_user:localhost"))
2098 .unwrap()
2099 .iter()
2100 .next()
2101 .unwrap();
2102 let signed_key: CrossSigningKey = serde_json::from_str(signed_key.get()).unwrap();
2103
2104 assert!(x509_verifier.verify_signed_object(user_id!("@own_user:localhost"), &signed_key));
2105 }
2106
2107 #[cfg(feature = "experimental-x509-identity-verification")]
2108 #[async_test]
2109 async fn test_verify_other_identity_with_x509() {
2110 let (ca_cert, ca_signing_key) = ca_cert();
2112
2113 let alice_identity_data = signed_other_identity(&ca_cert, &ca_signing_key).await;
2115
2116 let bob_account = Account::with_device_id(user_id!("@bob:hs.co"), device_id!("DEV123"));
2118 let bob_verification_machine = get_verification_machine(&bob_account);
2119
2120 let bob_identity_data =
2121 bob_verification_machine.get_own_user_identity_data().await.unwrap();
2122
2123 let mut bobs_view_of_alice = OtherUserIdentity {
2125 inner: alice_identity_data.clone(),
2126 own_identity: Some(bob_identity_data),
2127 verification_machine: bob_verification_machine.clone(),
2128 x509_verifier: None,
2129 };
2130
2131 assert!(!bobs_view_of_alice.is_verified());
2133
2134 bobs_view_of_alice.x509_verifier = Some(X509Verifier::new(Arc::new(
2136 RustRawX509Verifier::new_from_pem_data(&ca_cert.pem()).unwrap(),
2137 )));
2138
2139 assert!(bobs_view_of_alice.is_verified());
2141 }
2142
2143 #[cfg(feature = "experimental-x509-identity-verification")]
2147 async fn signed_other_identity(
2148 ca_cert: &Certificate,
2149 ca_signing_key: &KeyPair,
2150 ) -> OtherUserIdentityData {
2151 let (cert, signing_key) =
2152 cert_and_key_with_email_signed_by("alice@hs.co", ca_cert, ca_signing_key);
2153
2154 let x509_signer = X509Signer::new(Arc::new(
2155 RustRawX509Signer::new_from_pem_data(&cert.pem(), &signing_key.serialize_pem())
2156 .unwrap(),
2157 ));
2158
2159 let account = Account::with_device_id(user_id!("@alice:hs.co"), device_id!("DEV123"));
2160
2161 let private_identity =
2162 PrivateCrossSigningIdentity::for_account(&account, Some(&x509_signer)).unwrap();
2163
2164 let public_identity = private_identity.to_public_identity().await.unwrap();
2165
2166 OtherUserIdentityData::new(
2167 public_identity.master_key().clone(),
2168 public_identity.self_signing_key().clone(),
2169 )
2170 .unwrap()
2171 }
2172
2173 async fn other_user_identity() -> OtherUserIdentity {
2175 let other_user_identity_data = get_other_identity();
2176
2177 let account =
2178 Account::with_device_id(user_id!("@own_user:localhost"), device_id!("DEV123"));
2179
2180 let verification_machine = get_verification_machine(&account);
2181 let own_identity_data = verification_machine.get_own_user_identity_data().await.unwrap();
2182
2183 OtherUserIdentity {
2184 inner: other_user_identity_data,
2185 own_identity: Some(own_identity_data),
2186 verification_machine,
2187 #[cfg(feature = "experimental-x509-identity-verification")]
2188 x509_verifier: None,
2189 }
2190 }
2191
2192 fn get_verification_machine(account: &Account) -> VerificationMachine {
2199 let private_identity = PrivateCrossSigningIdentity::for_account(
2200 account,
2201 #[cfg(feature = "experimental-x509-identity-verification")]
2202 None,
2203 )
2204 .unwrap();
2205 VerificationMachine::new(
2206 account.static_data().clone(),
2207 Arc::new(Mutex::new(private_identity)),
2208 Arc::new(CryptoStoreWrapper::new(
2209 account.user_id(),
2210 account.device_id(),
2211 MemoryStore::new(),
2212 )),
2213 )
2214 }
2215
2216 #[cfg(feature = "experimental-x509-identity-verification")]
2221 async fn create_store_with_x509(
2222 account: Account,
2223 x509_verifier: X509Verifier,
2224 x509_signer: X509Signer,
2225 ) -> Store {
2226 use crate::store::types::{Changes, IdentityChanges, PendingChanges};
2227
2228 let account_static_data = account.static_data().clone();
2229 let private_identity = PrivateCrossSigningIdentity::for_account(&account, None).unwrap();
2230
2231 let crypto_store_wrapper =
2232 CryptoStoreWrapper::new(account.user_id(), account.device_id(), MemoryStore::new());
2233 crypto_store_wrapper
2234 .save_pending_changes(PendingChanges { account: Some(account) })
2235 .await
2236 .unwrap();
2237 let changes = Changes {
2238 private_identity: Some(private_identity.clone()),
2239 identities: IdentityChanges {
2240 changed: vec![private_identity.to_public_identity().await.unwrap().into()],
2241 ..Default::default()
2242 },
2243 ..Default::default()
2244 };
2245 crypto_store_wrapper.save_changes(changes).await.unwrap();
2246
2247 let crypto_store_wrapper = Arc::new(crypto_store_wrapper);
2248 let private_identity = Arc::new(Mutex::new(private_identity));
2249 let verification_machine = VerificationMachine::new(
2250 account_static_data.clone(),
2251 private_identity.clone(),
2252 crypto_store_wrapper.clone(),
2253 );
2254
2255 Store::new_with_x509(
2256 account_static_data.clone(),
2257 private_identity,
2258 crypto_store_wrapper,
2259 verification_machine,
2260 Some(x509_verifier),
2261 Some(x509_signer),
2262 )
2263 }
2264}