matrix_sdk_crypto/types/cross_signing/
mod.rs1mod common;
23mod master;
24mod self_signing;
25mod user_signing;
26
27pub use common::*;
28pub use master::*;
29pub use self_signing::*;
30pub use user_signing::*;
31
32macro_rules! impl_partial_eq {
33 ($key_type: ty) => {
34 impl PartialEq for $key_type {
35 fn eq(&self, other: &Self) -> bool {
47 self.user_id() == other.user_id()
48 && self.keys() == other.keys()
49 && self.usage() == other.usage()
50 }
51 }
52 impl Eq for $key_type {}
53 };
54}
55
56impl_partial_eq!(MasterPubkey);
57impl_partial_eq!(SelfSigningPubkey);
58impl_partial_eq!(UserSigningPubkey);
59
60#[cfg(test)]
61mod tests {
62 use matrix_sdk_test::async_test;
63 use ruma::{encryption::KeyUsage, user_id, DeviceKeyId};
64 use serde_json::json;
65 use vodozemac::Ed25519Signature;
66
67 use crate::{
68 identities::{
69 manager::testing::{own_key_query, own_key_query_with_user_id},
70 user::testing::get_other_own_identity,
71 },
72 types::{CrossSigningKey, MasterPubkey, SelfSigningPubkey, UserSigningPubkey},
73 };
74
75 #[test]
76 fn serialization() {
77 let json = json!({
78 "user_id": "@example:localhost",
79 "usage": [
80 "master"
81 ],
82 "keys": {
83 "ed25519:rJ2TAGkEOP6dX41Ksll6cl8K3J48l8s/59zaXyvl2p0": "rJ2TAGkEOP6dX41Ksll6cl8K3J48l8s/59zaXyvl2p0"
84 },
85 "signatures": {
86 "@example:localhost": {
87 "ed25519:WSKKLTJZCL": "ZzJp1wtmRdykXAUEItEjNiFlBrxx8L6/Vaen9am8AuGwlxxJtOkuY4m+4MPLvDPOgavKHLsrRuNLAfCeakMlCQ"
88 }
89 },
90 "other_data": "other"
91 });
92
93 let key: CrossSigningKey =
94 serde_json::from_value(json.clone()).expect("Can't deserialize cross signing key");
95
96 assert_eq!(key.user_id, user_id!("@example:localhost"));
97
98 let serialized = serde_json::to_value(key).expect("Can't reserialize cross signing key");
99
100 assert_eq!(json, serialized);
101 }
102
103 #[async_test]
104 async fn test_partial_eq_cross_signing_keys() {
105 macro_rules! test_partial_eq {
106 ($key_type:ident, $key_field:ident, $field:ident, $usage:expr) => {
107 let user_id = user_id!("@example:localhost");
108 let response = own_key_query();
109 let raw = response.$field.get(user_id).unwrap();
110 let key: $key_type = raw.deserialize_as().unwrap();
111
112 let other_identity = get_other_own_identity().await;
114 let other_key = other_identity.$key_field();
115 assert_ne!(&key, other_key);
116
117 let other_user_id = user_id!("@example2:localhost");
119 let other_response = own_key_query_with_user_id(&other_user_id);
120 let other_raw = other_response.$field.get(other_user_id).unwrap();
121 let other_key: $key_type = other_raw.deserialize_as().unwrap();
122 assert_ne!(key, other_key);
123
124 let signature = Ed25519Signature::from_base64(
126 "mia28GKixFzOWKJ0h7Bdrdy2fjxiHCsst1qpe467FbW85H61UlshtKBoAXfTLlVfi0FX+/noJ8B3noQPnY+9Cg"
127 ).expect("The signature can always be decoded");
128 let mut other_key: CrossSigningKey = raw.deserialize_as().unwrap();
129 other_key.signatures.add_signature(
130 user_id.to_owned(),
131 DeviceKeyId::from_parts(ruma::DeviceKeyAlgorithm::Ed25519, "DEVICEID".into()),
132 signature,
133 );
134 let other_key = other_key.try_into().unwrap();
135
136 assert_eq!(key, other_key);
138
139 let mut other_key: CrossSigningKey = raw.deserialize_as().unwrap();
141 other_key.usage.push($usage);
142 let other_key = $key_type { 0: other_key.into() };
143 assert_ne!(key, other_key);
144 };
145 }
146
147 test_partial_eq!(MasterPubkey, master_key, master_keys, KeyUsage::SelfSigning);
150 test_partial_eq!(SelfSigningPubkey, self_signing_key, self_signing_keys, KeyUsage::Master);
151 test_partial_eq!(UserSigningPubkey, user_signing_key, user_signing_keys, KeyUsage::Master);
152 }
153}