1#include "mtx/responses/crypto.hpp"
2
3#include <nlohmann/json.hpp>
4
5namespace mtx {
6namespace responses {
7
8void
9from_json(const nlohmann::json &obj, UploadKeys &response)
10{
11 response.one_time_key_counts =
12 obj.at(key: "one_time_key_counts").get<std::map<std::string, uint32_t>>();
13}
14
15void
16from_json(const nlohmann::json &obj, QueryKeys &response)
17{
18 if (obj.contains(key: "failures"))
19 response.failures = obj.at(key: "failures").get<std::map<std::string, nlohmann::json>>();
20 if (obj.contains(key: "device_keys"))
21 response.device_keys = obj.at(key: "device_keys").get<std::map<std::string, DeviceToKeysMap>>();
22 if (obj.contains(key: "master_keys"))
23 response.master_keys =
24 obj.at(key: "master_keys").get<std::map<std::string, mtx::crypto::CrossSigningKeys>>();
25 if (obj.contains(key: "user_signing_keys"))
26 response.user_signing_keys =
27 obj.at(key: "user_signing_keys").get<std::map<std::string, mtx::crypto::CrossSigningKeys>>();
28 if (obj.contains(key: "self_signing_keys"))
29 response.self_signing_keys =
30 obj.at(key: "self_signing_keys").get<std::map<std::string, mtx::crypto::CrossSigningKeys>>();
31}
32
33void
34to_json(nlohmann::json &obj, const QueryKeys &response)
35{
36 obj["failures"] = response.failures;
37 obj["device_keys"] = response.device_keys;
38 obj["master_keys"] = response.master_keys;
39 obj["user_signing_keys"] = response.user_signing_keys;
40 obj["self_signing_keys"] = response.self_signing_keys;
41}
42
43void
44from_json(const nlohmann::json &obj, KeySignaturesUpload &response)
45{
46 if (obj.contains(key: "failures"))
47 response.errors = obj.at(key: "failures").get<decltype(response.errors)>();
48}
49
50void
51from_json(const nlohmann::json &obj, ClaimKeys &response)
52{
53 if (obj.contains(key: "failures"))
54 response.failures = obj.at(key: "failures").get<std::map<std::string, nlohmann::json>>();
55 if (obj.contains(key: "one_time_keys"))
56 response.one_time_keys =
57 obj.at(key: "one_time_keys")
58 .get<std::map<std::string, std::map<std::string, nlohmann::json>>>();
59}
60
61void
62from_json(const nlohmann::json &obj, KeyChanges &response)
63{
64 if (obj.contains(key: "changed"))
65 response.changed = obj.at(key: "changed").get<std::vector<std::string>>();
66 if (obj.contains(key: "left"))
67 response.left = obj.at(key: "left").get<std::vector<std::string>>();
68}
69
70namespace backup {
71void
72from_json(const nlohmann::json &obj, EncryptedSessionData &response)
73{
74 response.ephemeral = obj.at(key: "ephemeral").get<std::string>();
75 response.ciphertext = obj.at(key: "ciphertext").get<std::string>();
76 response.mac = obj.at(key: "mac").get<std::string>();
77}
78void
79to_json(nlohmann::json &obj, const EncryptedSessionData &response)
80{
81 obj["ephemeral"] = response.ephemeral;
82 obj["ciphertext"] = response.ciphertext;
83 obj["mac"] = response.mac;
84}
85
86void
87from_json(const nlohmann::json &obj, SessionBackup &response)
88{
89 response.first_message_index = obj.at(key: "first_message_index").get<int64_t>();
90 response.forwarded_count = obj.at(key: "forwarded_count").get<int64_t>();
91 response.is_verified = obj.at(key: "is_verified").get<bool>();
92 response.session_data = obj.at(key: "session_data").get<EncryptedSessionData>();
93}
94void
95to_json(nlohmann::json &obj, const SessionBackup &response)
96{
97 obj["first_message_index"] = response.first_message_index;
98 obj["forwarded_count"] = response.forwarded_count;
99 obj["is_verified"] = response.is_verified;
100 obj["session_data"] = response.session_data;
101}
102
103void
104from_json(const nlohmann::json &obj, RoomKeysBackup &response)
105{
106 response.sessions = obj.at(key: "sessions").get<decltype(response.sessions)>();
107}
108void
109to_json(nlohmann::json &obj, const RoomKeysBackup &response)
110{
111 obj["sessions"] = response.sessions;
112}
113
114void
115from_json(const nlohmann::json &obj, KeysBackup &response)
116{
117 response.rooms = obj.at(key: "rooms").get<decltype(response.rooms)>();
118}
119void
120to_json(nlohmann::json &obj, const KeysBackup &response)
121{
122 obj["rooms"] = response.rooms;
123}
124
125void
126from_json(const nlohmann::json &obj, BackupVersion &response)
127{
128 response.algorithm = obj.at(key: "algorithm").get<std::string>();
129 response.auth_data = obj.at(key: "auth_data").dump();
130 response.count = obj.at(key: "count").get<int64_t>();
131 response.etag =
132 obj.at(key: "etag").dump(); // workaround, since synapse 1.15.1 and older sends this as integer
133 response.version = obj.at(key: "version").get<std::string>();
134}
135void
136to_json(nlohmann::json &obj, const BackupVersion &response)
137{
138 obj["algorithm"] = response.algorithm;
139 obj["auth_data"] = nlohmann::json::parse(i: response.auth_data);
140 obj["count"] = response.count;
141 obj["etag"] = response.etag;
142 obj["version"] = response.version;
143}
144
145void
146to_json(nlohmann::json &obj, const SessionData &data)
147{
148 obj["algorithm"] = data.algorithm;
149 obj["forwarding_curve25519_key_chain"] = data.forwarding_curve25519_key_chain;
150 obj["sender_key"] = data.sender_key;
151 obj["sender_claimed_keys"] = data.sender_claimed_keys;
152 obj["session_key"] = data.session_key;
153}
154
155void
156from_json(const nlohmann::json &obj, SessionData &data)
157{
158 data.algorithm = obj.at(key: "algorithm").get<std::string>();
159 data.forwarding_curve25519_key_chain = obj.at(key: "forwarding_curve25519_key_chain")
160 .get<decltype(data.forwarding_curve25519_key_chain)>();
161 data.sender_key = obj.at(key: "sender_key").get<std::string>();
162 // required, but some clients don't send it
163 data.sender_claimed_keys =
164 obj.value(key: "sender_claimed_keys", default_value: std::map<std::string, std::string>());
165 data.session_key = obj.at(key: "session_key").get<std::string>();
166}
167}
168}
169}
170