matrix_sdk_test/test_json/
keys_query.rs1use std::{collections::HashMap, iter};
20
21use ruma::{
22 DeviceId, UserId, api::client::keys::get_keys::v3::Response as KeyQueryResponse, device_id,
23 user_id,
24};
25use serde_json::json;
26
27use crate::ruma_response_from_json;
28
29pub struct KeysQueryUser {
30 pub user_id: &'static UserId,
31 pub device_id: &'static DeviceId,
32 device_key_curve25519: &'static str,
33 device_key_ed22519: &'static str,
34 device_signature: &'static str,
35 device_signature_2_name: Option<&'static str>,
36 device_signature_2_signature: Option<&'static str>,
37 master_key_name: Option<&'static str>,
38 master_key_signature: Option<&'static str>,
39 master_key_device_signature: Option<&'static str>,
40 self_signing_key_name: Option<&'static str>,
41 self_signing_key_signature: Option<&'static str>,
42}
43
44impl KeysQueryUser {
45 pub(crate) fn bob_a() -> Self {
46 Self {
47 user_id: user_id!("@bob:localhost"),
48 device_id: device_id!("GYKSNAWLVK"),
49 device_key_curve25519: "dBcZBzQaiQYWf6rBPh2QypIOB/dxSoTeyaFaxNNbeHs",
50 device_key_ed22519: "6melQNnhoI9sT2b4VzNPAwa8aB179ym45fON8Yo7kVk",
51 device_signature: "Fk45zHAbrd+1j9wZXLjL2Y/+DU/Mnz9yuvlfYBOOT7qExN2Jdud+5BAuNs8nZ/caS4wTF39Kg3zQpzaGERoCBg",
52 device_signature_2_name: Some("dO4gmBNW7WC0bXBK81j8uh4me6085fP+keoOm0pH3gw"),
53 device_signature_2_signature: Some(
54 "md0Pa1MYlneFb1fp6KCsvZpi2ySb6/G+ULoCbQDWBeDxNEcoNMzf7PEKY04UToCZKUU4LifvRWmiWFDanOlkCQ",
55 ),
56 master_key_name: Some("/mULSzYNTdHJOBWnBmsvDHhqdHQcWnXRHHmqwzwC7DY"),
57 master_key_signature: Some(
58 "6vGDbPO5XzlcwbU3aV+kcck+iHHEBtX85ow2gW5U05/DZdtda/JNVa5Nn7B9lQHNnnrMqt1sX00y/JrIkSS1Aw",
59 ),
60 master_key_device_signature: Some(
61 "jLxmUPr0Ny2Ai9+NGKGhed9BAuKikOc7r6gr7MQVawePYS95w8NJ8Tzaq9zFFOmIiojACNdQ/ksy3QAdwD6vBQ",
62 ),
63 self_signing_key_name: Some("dO4gmBNW7WC0bXBK81j8uh4me6085fP+keoOm0pH3gw"),
64 self_signing_key_signature: Some(
65 "7md6mwjUK8zjintmffJ0+kImC59/Y8PdySy99EZz5Neu+VMX3LT7txhKO2gC/hmDduRw+JGfGXIiDxR7GmQqDw",
66 ),
67 }
68 }
69
70 pub(crate) fn bob_b() -> Self {
71 Self {
72 user_id: user_id!("@bob:localhost"),
73 device_id: device_id!("ATWKQFSFRN"),
74 device_key_curve25519: "CY0TWVK1/Kj3ZADuBcGe3UKvpT+IKAPMUsMeJhSDqno",
75 device_key_ed22519: "TyTQqd6j2JlWZh97r+kTYuCbvqnPoNwO6EGovYsjY00",
76 device_signature: "BQ9Gp0p+6srF+c8OyruqKKd9R4yaub3THYAyyBB/7X/rG8BwcAqFynzl1aGyFYun4Q+087a5OSiglCXI+/kQAA",
77 device_signature_2_name: Some("At1ai1VUZrCncCI7V7fEAJmBShfpqZ30xRzqcEjTjdc"),
78 device_signature_2_signature: Some(
79 "TWmDPaG7t0rZ6luauonELD3dmBDTIRryqXhgsIQRiGint2rJdic8RVyZ6a61bgu6mtBjfvU3prqMNp6sVi16Cg",
80 ),
81 master_key_name: Some("NmI78hY54kE7OZsIjbRE/iCox59t4nzScCNEO6fvtY4"),
82 master_key_signature: Some(
83 "xqLhC3sIUci1W2CNVW7HZWXreQApgjv2RDwB0WPiMd1P4vbZ/qJM0KWqK2piGPWliPi8YVREMrg216KXM3IhCA",
84 ),
85 master_key_device_signature: Some(
86 "MBOzCKYPQLQMpBY2lFZJ4c8451xJfQCdhPBb1AHlTUSxKFiWi6V+k1oRRnhQein/PjkIY7ZO+HoOrIeOtbRMAw",
87 ),
88 self_signing_key_name: Some("At1ai1VUZrCncCI7V7fEAJmBShfpqZ30xRzqcEjTjdc"),
89 self_signing_key_signature: Some(
90 "Ls6CeoA4LoPCHuSwG96kbhd1dEV09TgdMROIZi6vFz/MT9Wtik6joQi/tQ3zCwIZCSR53ksLO4jG1DD31AiBAA",
91 ),
92 }
93 }
94
95 pub(crate) fn bob_c() -> Self {
96 Self {
97 user_id: user_id!("@bob:localhost"),
98 device_id: device_id!("OPABMDDXGX"),
99 device_key_curve25519: "O6bwa9Op0E+PQPCrbTOfdYwU+j95RRPhXIHuNpe94ns",
100 device_key_ed22519: "DvjkSNOM9XrR1gWrr2YSDvTnwnLIgKDMRr5v8HgMKak",
101 device_signature: "o+BBnw/SIJWxSf799Adq6jEl9X3lwCg5MJkS8GlfId+pW3ReEETK0l+9bhCAgBsNSKRtB/fmZQBhjMx4FJr+BA",
102 device_signature_2_name: None,
103 device_signature_2_signature: None,
104 master_key_name: None,
105 master_key_signature: None,
106 master_key_device_signature: None,
107 self_signing_key_name: None,
108 self_signing_key_signature: None,
109 }
110 }
111}
112
113pub fn keys_query(user: &KeysQueryUser, signed_device_users: &[KeysQueryUser]) -> KeyQueryResponse {
114 let device_keys = iter::once((user.user_id, device_keys(user, signed_device_users)));
115
116 let data = json!({
117 "device_keys": to_object(device_keys),
118 "failures": {},
119 "master_keys": master_keys(user),
120 "self_signing_keys": self_signing_keys(user),
121 "user_signing_keys": {}
122 });
123 ruma_response_from_json(&data)
124}
125
126pub fn self_signing_keys(user: &KeysQueryUser) -> serde_json::Value {
127 if let (Some(self_signing_key_name), Some(self_signing_key_signature)) =
128 (user.self_signing_key_name, user.self_signing_key_signature)
129 {
130 let master_key_name = user
131 .master_key_name
132 .expect("Missing master key name when we have self_signing_key_name");
133
134 json!({
135 user.user_id: {
136 "keys": {
137 &format!("ed25519:{self_signing_key_name}"): self_signing_key_name
138 },
139 "signatures": {
140 "@bob:localhost": {
141 &format!("ed25519:{master_key_name}"): self_signing_key_signature,
142 }
143 },
144 "usage": [ "self_signing" ],
145 "user_id": "@bob:localhost"
146 }
147 })
148 } else {
149 json!({})
150 }
151}
152
153pub fn master_keys(user: &KeysQueryUser) -> serde_json::Value {
154 if let (Some(master_key_name), Some(master_key_signature), Some(master_key_device_signature)) =
155 (user.master_key_name, user.master_key_signature, user.master_key_device_signature)
156 {
157 json!({
158 user.user_id: {
159 "keys": { &format!("ed25519:{master_key_name}"): master_key_name },
160 "signatures": {
161 user.user_id: {
162 &format!("ed25519:{master_key_name}"): master_key_signature,
163 &format!("ed25519:{}", user.device_id): master_key_device_signature
164 }
165 },
166 "usage": [ "master" ],
167 "user_id": user.user_id
168 }
169 })
170 } else {
171 json!({})
172 }
173}
174
175pub fn device_keys_payload(user: &KeysQueryUser) -> serde_json::Value {
176 let mut signatures = HashMap::new();
177 signatures.insert(format!("ed25519:{}", user.device_id), user.device_signature);
178
179 if let (Some(device_signature_2_name), Some(device_signature_2_signature)) =
180 (user.device_signature_2_name, user.device_signature_2_signature)
181 {
182 signatures
183 .insert(format!("ed25519:{device_signature_2_name}"), device_signature_2_signature);
184 }
185
186 json!({
187 "algorithms": [
188 "m.olm.v1.curve25519-aes-sha2",
189 "m.megolm.v1.aes-sha2"
190 ],
191 "device_id": user.device_id,
192 "keys": {
193 &format!("curve25519:{}", user.device_id): user.device_key_curve25519,
194 &format!("ed25519:{}", user.device_id): user.device_key_ed22519,
195 },
196 "signatures": {
197 user.user_id: signatures
198 },
199 "user_id": user.user_id,
200 })
201}
202
203fn device_keys(user: &KeysQueryUser, signed_device_users: &[KeysQueryUser]) -> serde_json::Value {
204 let mut ret = HashMap::new();
205
206 ret.insert(user.device_id, device_keys_payload(user));
207
208 for other in signed_device_users {
209 ret.insert(other.device_id, device_keys_payload(other));
210 }
211
212 json!(ret)
213}
214
215fn to_object(
216 items: impl Iterator<Item = (&'static UserId, serde_json::Value)>,
217) -> serde_json::Value {
218 let mp: HashMap<&'static UserId, serde_json::Value> = items.collect();
219 serde_json::to_value(mp).unwrap()
220}