diff --git a/lib/encryption/cross_signing.dart b/lib/encryption/cross_signing.dart index c3e809b..b525a7b 100644 --- a/lib/encryption/cross_signing.dart +++ b/lib/encryption/cross_signing.dart @@ -152,7 +152,8 @@ class CrossSigning { if (key is CrossSigningKey) { if (key.usage.contains('master')) { // okay, we'll sign our own master key - final signature = encryption.olmManager.signString(key.signingContent); + final signature = + encryption.olmManager.signString(key.signingContent); addSignature( key, client @@ -172,8 +173,8 @@ class CrossSigning { } } else if (key is CrossSigningKey && key.usage.contains('master')) { // we are signing someone elses master key - userSigningKey ??= - base64.decode(await encryption.ssss.getCached(USER_SIGNING_KEY) ?? ''); + userSigningKey ??= base64 + .decode(await encryption.ssss.getCached(USER_SIGNING_KEY) ?? ''); if (userSigningKey.isNotEmpty) { final signature = _sign(key.signingContent, userSigningKey); addSignature(key, client.userDeviceKeys[client.userID].userSigningKey, diff --git a/lib/encryption/encryption.dart b/lib/encryption/encryption.dart index ef35840..bb76912 100644 --- a/lib/encryption/encryption.dart +++ b/lib/encryption/encryption.dart @@ -93,7 +93,11 @@ class Encryption { if (update.type == 'ephemeral') { return; } - if (update.eventType.startsWith('m.key.verification.') || (update.eventType == 'm.room.message' && (update.content['content']['msgtype'] is String) && update.content['content']['msgtype'].startsWith('m.key.verification.'))) { + if (update.eventType.startsWith('m.key.verification.') || + (update.eventType == 'm.room.message' && + (update.content['content']['msgtype'] is String) && + update.content['content']['msgtype'] + .startsWith('m.key.verification.'))) { // "just" key verification, no need to do this in sync unawaited(keyVerificationManager.handleEventUpdate(update)); } diff --git a/lib/encryption/key_manager.dart b/lib/encryption/key_manager.dart index 7855de3..76f0a4e 100644 --- a/lib/encryption/key_manager.dart +++ b/lib/encryption/key_manager.dart @@ -321,7 +321,8 @@ class KeyManager { if (!(payload['rooms'] is Map)) { return; } - final privateKey = base64.decode(await encryption.ssss.getCached(MEGOLM_KEY)); + final privateKey = + base64.decode(await encryption.ssss.getCached(MEGOLM_KEY)); final decryption = olm.PkDecryption(); final info = await getRoomKeysInfo(); String backupPubKey; @@ -373,7 +374,9 @@ class KeyManager { if (decrypted != null) { decrypted['session_id'] = sessionId; decrypted['room_id'] = roomId; - setInboundGroupSession(roomId, sessionId, decrypted['sender_key'], decrypted, forwarded: true); + setInboundGroupSession( + roomId, sessionId, decrypted['sender_key'], decrypted, + forwarded: true); } } } @@ -403,7 +406,8 @@ class KeyManager { /// Request a certain key from another device Future request(Room room, String sessionId, String senderKey) async { // let's first check our online key backup store thingy... - var hadPreviously = getInboundGroupSession(room.id, sessionId, senderKey) != null; + var hadPreviously = + getInboundGroupSession(room.id, sessionId, senderKey) != null; try { await loadSingleKey(room.id, sessionId); } catch (err, stacktrace) { @@ -411,7 +415,8 @@ class KeyManager { print(err.toString()); print(stacktrace); } - if (!hadPreviously && getInboundGroupSession(room.id, sessionId, senderKey) != null) { + if (!hadPreviously && + getInboundGroupSession(room.id, sessionId, senderKey) != null) { return; // we managed to load the session from online backup, no need to care about it now } // while we just send the to-device event to '*', we still need to save the diff --git a/lib/encryption/key_verification_manager.dart b/lib/encryption/key_verification_manager.dart index c2accf5..ba80770 100644 --- a/lib/encryption/key_verification_manager.dart +++ b/lib/encryption/key_verification_manager.dart @@ -29,7 +29,7 @@ class KeyVerificationManager { final Map _requests = {}; Future cleanup() async { - Set entriesToDispose = {}; + final Set entriesToDispose = {}; for (final entry in _requests.entries) { var dispose = entry.value.canceled || entry.value.state == KeyVerificationState.done || @@ -55,7 +55,8 @@ class KeyVerificationManager { } Future handleToDeviceEvent(ToDeviceEvent event) async { - if (!event.type.startsWith('m.key.verification') || client.verificationMethods.isEmpty) { + if (!event.type.startsWith('m.key.verification') || + client.verificationMethods.isEmpty) { return; } // we have key verification going on! @@ -84,7 +85,9 @@ class KeyVerificationManager { final type = event['type'].startsWith('m.key.verification.') ? event['type'] : event['content']['msgtype']; - if (type == null || !type.startsWith('m.key.verification.') || client.verificationMethods.isEmpty) { + if (type == null || + !type.startsWith('m.key.verification.') || + client.verificationMethods.isEmpty) { return; } if (type == 'm.key.verification.request') { @@ -97,7 +100,7 @@ class KeyVerificationManager { if (_requests.containsKey(transactionId)) { final req = _requests[transactionId]; if (event['sender'] != client.userID) { - req.handlePayload(type, event['content'], event['event_id']); + await req.handlePayload(type, event['content'], event['event_id']); } else if (req.userId == client.userID && req.deviceId == null) { // okay, maybe another of our devices answered await req.handlePayload(type, event['content'], event['event_id']); @@ -108,12 +111,12 @@ class KeyVerificationManager { } } } else if (event['sender'] != client.userID) { - final room = - client.getRoomById(update.roomID) ?? Room(id: update.roomID, client: client); - final newKeyRequest = - KeyVerification(encryption: encryption, userId: event['sender'], room: room); - await newKeyRequest - .handlePayload(type, event['content'], event['event_id']); + final room = client.getRoomById(update.roomID) ?? + Room(id: update.roomID, client: client); + final newKeyRequest = KeyVerification( + encryption: encryption, userId: event['sender'], room: room); + await newKeyRequest.handlePayload( + type, event['content'], event['event_id']); if (newKeyRequest.state != KeyVerificationState.askAccept) { // something went wrong, let's just dispose the request newKeyRequest.dispose(); diff --git a/lib/encryption/ssss.dart b/lib/encryption/ssss.dart index 6785f3d..ae792f5 100644 --- a/lib/encryption/ssss.dart +++ b/lib/encryption/ssss.dart @@ -177,7 +177,10 @@ class SSSS { } // check if it is still valid final keys = keyIdsFromType(type); - if (keys.contains(ret.keyId) && client.accountData[type].content['encrypted'][ret.keyId]['ciphertext'] == ret.ciphertext) { + if (keys.contains(ret.keyId) && + client.accountData[type].content['encrypted'][ret.keyId] + ['ciphertext'] == + ret.ciphertext) { return ret.content; } return null; @@ -200,7 +203,8 @@ class SSSS { final decrypted = decryptAes(encryptInfo, key, type); if (CACHE_TYPES.contains(type) && client.database != null) { // cache the thing - await client.database.storeSSSSCache(client.id, type, keyId, enc['ciphertext'], decrypted); + await client.database + .storeSSSSCache(client.id, type, keyId, enc['ciphertext'], decrypted); } return decrypted; } @@ -224,7 +228,8 @@ class SSSS { ); if (CACHE_TYPES.contains(type) && client.database != null) { // cache the thing - await client.database.storeSSSSCache(client.id, type, keyId, encrypted.ciphertext, secret); + await client.database + .storeSSSSCache(client.id, type, keyId, encrypted.ciphertext, secret); } } @@ -352,9 +357,10 @@ class SSSS { if (client.database != null) { final keyId = keyIdFromType(request.type); if (keyId != null) { - final ciphertext = client.accountData[request.type].content['encrypted'][keyId]['ciphertext']; - await client.database - .storeSSSSCache(client.id, request.type, keyId, ciphertext, secret); + final ciphertext = client.accountData[request.type] + .content['encrypted'][keyId]['ciphertext']; + await client.database.storeSSSSCache( + client.id, request.type, keyId, ciphertext, secret); } } } diff --git a/lib/matrix_api/model/keys_query_response.dart b/lib/matrix_api/model/keys_query_response.dart index 3e4f2a1..4fef3f3 100644 --- a/lib/matrix_api/model/keys_query_response.dart +++ b/lib/matrix_api/model/keys_query_response.dart @@ -41,32 +41,32 @@ class KeysQueryResponse { ), ) : null; - masterKeys = json['master_keys'] != null ? - (json['master_keys'] as Map).map( - (k, v) => MapEntry( - k, - MatrixCrossSigningKey.fromJson(v), - ), - ) - : null; + masterKeys = json['master_keys'] != null + ? (json['master_keys'] as Map).map( + (k, v) => MapEntry( + k, + MatrixCrossSigningKey.fromJson(v), + ), + ) + : null; - selfSigningKeys = json['self_signing_keys'] != null ? - (json['self_signing_keys'] as Map).map( - (k, v) => MapEntry( - k, - MatrixCrossSigningKey.fromJson(v), - ), - ) - : null; + selfSigningKeys = json['self_signing_keys'] != null + ? (json['self_signing_keys'] as Map).map( + (k, v) => MapEntry( + k, + MatrixCrossSigningKey.fromJson(v), + ), + ) + : null; - userSigningKeys = json['user_signing_keys'] != null ? - (json['user_signing_keys'] as Map).map( - (k, v) => MapEntry( - k, - MatrixCrossSigningKey.fromJson(v), - ), - ) - : null; + userSigningKeys = json['user_signing_keys'] != null + ? (json['user_signing_keys'] as Map).map( + (k, v) => MapEntry( + k, + MatrixCrossSigningKey.fromJson(v), + ), + ) + : null; } Map toJson() { diff --git a/lib/src/client.dart b/lib/src/client.dart index 9102f55..6e324e8 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -1160,7 +1160,8 @@ class Client { final deviceId = rawDeviceKeyEntry.key; // Set the new device key for this device - final entry = DeviceKeys.fromMatrixDeviceKeys(rawDeviceKeyEntry.value, this); + final entry = + DeviceKeys.fromMatrixDeviceKeys(rawDeviceKeyEntry.value, this); if (entry.isValid) { // is this a new key or the same one as an old one? // better store an update - the signatures might have changed! @@ -1231,7 +1232,8 @@ class Client { if (!userDeviceKeys.containsKey(userId)) { _userDeviceKeys[userId] = DeviceKeysList(userId); } - final oldKeys = Map.from(_userDeviceKeys[userId].crossSigningKeys); + final oldKeys = Map.from( + _userDeviceKeys[userId].crossSigningKeys); _userDeviceKeys[userId].crossSigningKeys = {}; // add the types we aren't handling atm back for (final oldEntry in oldKeys.entries) { @@ -1240,8 +1242,8 @@ class Client { oldEntry.value; } } - final entry = - CrossSigningKey.fromMatrixCrossSigningKey(crossSigningKeyListEntry.value, this); + final entry = CrossSigningKey.fromMatrixCrossSigningKey( + crossSigningKeyListEntry.value, this); if (entry.isValid) { final publicKey = entry.publicKey; if (!oldKeys.containsKey(publicKey) || diff --git a/lib/src/utils/device_keys_list.dart b/lib/src/utils/device_keys_list.dart index 6f31e81..0297668 100644 --- a/lib/src/utils/device_keys_list.dart +++ b/lib/src/utils/device_keys_list.dart @@ -60,7 +60,8 @@ class DeviceKeysList { throw 'Unable to start new room'; } final room = client.getRoomById(roomId) ?? Room(id: roomId, client: client); - final request = KeyVerification(encryption: client.encryption, room: room, userId: userId); + final request = KeyVerification( + encryption: client.encryption, room: room, userId: userId); await request.start(); // no need to add to the request client object. As we are doing a room // verification request that'll happen automatically once we know the transaction id @@ -224,7 +225,9 @@ abstract class SignedKey { Future setVerified(bool newVerified, [bool sign = true]) { _verified = newVerified; - if (sign && client.encryptionEnabled && client.encryption.crossSigning.signable([this])) { + if (sign && + client.encryptionEnabled && + client.encryption.crossSigning.signable([this])) { // sign the key! client.encryption.crossSigning.sign([this]); } @@ -266,13 +269,16 @@ class CrossSigningKey extends SignedKey { newBlocked, client.id, userId, publicKey); } - CrossSigningKey.fromMatrixCrossSigningKey(MatrixCrossSigningKey k, Client cl) { + CrossSigningKey.fromMatrixCrossSigningKey( + MatrixCrossSigningKey k, Client cl) { client = cl; content = Map.from(k.toJson()); userId = k.userId; identifier = k.publicKey; usage = content['usage'].cast(); - keys = content['keys'] != null ? Map.from(content['keys']) : null; + keys = content['keys'] != null + ? Map.from(content['keys']) + : null; signatures = content['signatures'] != null ? Map.from(content['signatures']) : null; @@ -397,8 +403,8 @@ class DeviceKeys extends SignedKey { } KeyVerification startVerification() { - final request = - KeyVerification(encryption: client.encryption, userId: userId, deviceId: deviceId); + final request = KeyVerification( + encryption: client.encryption, userId: userId, deviceId: deviceId); request.start(); client.encryption.keyVerificationManager.addRequest(request); diff --git a/test/device_keys_list_test.dart b/test/device_keys_list_test.dart index 54e3e1f..c1f3204 100644 --- a/test/device_keys_list_test.dart +++ b/test/device_keys_list_test.dart @@ -42,15 +42,10 @@ void main() { }, 'unsigned': {'device_display_name': "Alice's mobile phone"}, }; - var rawListJson = { - 'user_id': '@alice:example.com', - 'outdated': true, - 'device_keys': {'JLAFKJWSCS': rawJson}, - }; final key = DeviceKeys.fromJson(rawJson, null); - key.setVerified(false, false); - key.setBlocked(true); + await key.setVerified(false, false); + await key.setBlocked(true); expect(json.encode(key.toJson()), json.encode(rawJson)); expect(key.directVerified, false); expect(key.blocked, true);