diff --git a/src/timeline/TimelineView.cc b/src/timeline/TimelineView.cc
index c2c92a37..9a69c58a 100644
--- a/src/timeline/TimelineView.cc
+++ b/src/timeline/TimelineView.cc
@@ -1277,19 +1277,22 @@ TimelineView::prepareEncryptedMessage(const PendingMessage &msg)
return;
}
- for (const auto &entry : res.device_keys) {
- for (const auto &dev : entry.second) {
- nhlog::net()->info("received device {}", dev.first);
+ for (const auto &user : res.device_keys) {
+ for (const auto &dev : user.second) {
+ const auto user_id = UserId(dev.second.user_id);
+ const auto device_id = DeviceId(dev.second.device_id);
+
+ nhlog::net()->info("device_id {}", device_id.get());
const auto device_keys = dev.second.keys;
- const auto curveKey = "curve25519:" + dev.first;
- const auto edKey = "ed25519:" + dev.first;
+ const auto curveKey = "curve25519:" + device_id.get();
+ const auto edKey = "ed25519:" + device_id.get();
if ((device_keys.find(curveKey) == device_keys.end()) ||
(device_keys.find(edKey) == device_keys.end())) {
nhlog::net()->info(
"ignoring malformed keys for device {}",
- dev.first);
+ device_id.get());
continue;
}
@@ -1303,23 +1306,36 @@ TimelineView::prepareEncryptedMessage(const PendingMessage &msg)
"dev keys {} {}", algo.first, algo.second);
}
- auto room_key =
- olm::client()
- ->create_room_key_event(UserId(dev.second.user_id),
- pks.ed25519,
- megolm_payload)
- .dump();
+ try {
+ if (!mtx::crypto::verify_identity_signature(
+ json(dev.second), device_id, user_id)) {
+ nhlog::crypto()->warn(
+ "failed to verify identity keys: {}",
+ json(dev.second).dump(2));
+ continue;
+ }
+ } catch (const json::exception &e) {
+ nhlog::crypto()->warn(
+ "failed to parse device key json: {}",
+ e.what());
+ continue;
+ }
+
+ auto room_key = olm::client()
+ ->create_room_key_event(
+ user_id, pks.ed25519, megolm_payload)
+ .dump();
http::v2::client()->claim_keys(
- dev.second.user_id,
- {dev.second.device_id},
+ user_id,
+ {device_id},
std::bind(&TimelineView::handleClaimedKeys,
this,
keeper,
room_key,
pks,
- dev.second.user_id,
- dev.second.device_id,
+ user_id,
+ device_id,
std::placeholders::_1,
std::placeholders::_2));
}
|