omemo_dart/test/serialisation_test.dart

156 lines
5.4 KiB
Dart
Raw Normal View History

import 'dart:convert';
2022-08-05 15:32:59 +00:00
import 'package:omemo_dart/omemo_dart.dart';
2023-06-14 12:03:11 +00:00
import 'package:omemo_dart/protobuf/schema.pb.dart';
2022-08-08 16:03:05 +00:00
import 'package:omemo_dart/src/trust/always.dart';
2022-08-05 15:32:59 +00:00
import 'package:test/test.dart';
Map<String, dynamic> jsonify(Map<String, dynamic> map) {
return jsonDecode(jsonEncode(map)) as Map<String, dynamic>;
}
2022-08-05 15:32:59 +00:00
void main() {
2022-08-05 16:14:10 +00:00
test('Test serialising and deserialising the Device', () async {
2022-08-05 15:32:59 +00:00
// Generate a random session
2023-06-12 21:39:08 +00:00
final oldDevice =
await OmemoDevice.generateNewDevice('user@test.server', opkAmount: 5);
final serialised = jsonify(await oldDevice.toJson());
2022-08-05 15:32:59 +00:00
final newDevice = OmemoDevice.fromJson(serialised);
expect(await oldDevice.equals(newDevice), true);
2022-08-05 15:32:59 +00:00
});
2022-08-05 16:14:10 +00:00
2023-06-12 17:20:43 +00:00
test('Test serialising and deserialising the Device after rotating the SPK',
() async {
// Generate a random session
2023-06-12 21:39:08 +00:00
final device =
await OmemoDevice.generateNewDevice('user@test.server', opkAmount: 1);
final oldDevice = await device.replaceSignedPrekey();
final serialised = jsonify(await oldDevice.toJson());
final newDevice = OmemoDevice.fromJson(serialised);
expect(await oldDevice.equals(newDevice), true);
});
2023-06-12 17:20:43 +00:00
2023-06-12 21:39:08 +00:00
/*test('Test serialising and deserialising the OmemoDoubleRatchet', () async {
2022-08-05 16:14:10 +00:00
// Generate a random ratchet
const aliceJid = 'alice@server.example';
const bobJid = 'bob@other.server.example';
2023-06-12 21:39:08 +00:00
final aliceManager = OmemoSessionManager.generateNewIdentity(
2022-08-08 16:03:05 +00:00
aliceJid,
AlwaysTrustingTrustManager(),
opkAmount: 1,
);
final bobSession = await OmemoSessionManager.generateNewIdentity(
bobJid,
AlwaysTrustingTrustManager(),
opkAmount: 1,
);
2022-08-05 16:14:10 +00:00
final aliceMessage = await aliceSession.encryptToJid(
bobJid,
'Hello Bob!',
newSessions: [
await bobSession.getDeviceBundle(),
2022-08-05 16:14:10 +00:00
],
);
await bobSession.decryptMessage(
aliceMessage.ciphertext,
aliceJid,
await aliceSession.getDeviceId(),
2022-08-05 16:14:10 +00:00
aliceMessage.encryptedKeys,
getTimestamp(),
2022-08-05 16:14:10 +00:00
);
2023-06-12 17:20:43 +00:00
final aliceOld =
aliceSession.getRatchet(bobJid, await bobSession.getDeviceId());
final aliceSerialised = jsonify(await aliceOld.toJson());
2022-08-05 16:14:10 +00:00
final aliceNew = OmemoDoubleRatchet.fromJson(aliceSerialised);
expect(await aliceOld.equals(aliceNew), true);
});
test('Test serialising and deserialising the OmemoSessionManager', () async {
// Generate a random session
2022-08-08 16:03:05 +00:00
final oldSession = await OmemoSessionManager.generateNewIdentity(
'a@server',
AlwaysTrustingTrustManager(),
opkAmount: 4,
);
final bobSession = await OmemoSessionManager.generateNewIdentity(
'b@other.server',
AlwaysTrustingTrustManager(),
opkAmount: 4,
);
await oldSession.addSessionFromBundle(
'bob@localhost',
await bobSession.getDeviceId(),
await bobSession.getDeviceBundle(),
);
// Serialise and deserialise
final serialised = jsonify(await oldSession.toJsonWithoutSessions());
final newSession = OmemoSessionManager.fromJsonWithoutSessions(
2022-08-08 16:03:05 +00:00
serialised,
// NOTE: At this point, we don't care about this attribute
{},
2022-08-08 16:03:05 +00:00
AlwaysTrustingTrustManager(),
);
final oldDevice = await oldSession.getDevice();
final newDevice = await newSession.getDevice();
expect(await oldDevice.equals(newDevice), true);
2022-08-11 10:02:21 +00:00
expect(await oldSession.getDeviceMap(), await newSession.getDeviceMap());
2022-08-05 16:14:10 +00:00
});
test('Test serializing and deserializing RatchetMapKey', () {
const test1 = RatchetMapKey('user@example.org', 1234);
final result1 = RatchetMapKey.fromJsonKey(test1.toJsonKey());
expect(result1.jid, test1.jid);
expect(result1.deviceId, test1.deviceId);
const test2 = RatchetMapKey('user@example.org/hallo:welt', 3333);
final result2 = RatchetMapKey.fromJsonKey(test2.toJsonKey());
expect(result2.jid, test2.jid);
expect(result2.deviceId, test2.deviceId);
});
2023-06-12 17:20:43 +00:00
test('Test serializing and deserializing the components of the BTBV manager',
() async {
// Caroline's BTBV manager
final btbv = MemoryBTBVTrustManager();
// Example data
const aliceJid = 'alice@some.server';
const bobJid = 'bob@other.server';
2023-06-12 17:20:43 +00:00
await btbv.onNewSession(aliceJid, 1);
await btbv.setDeviceTrust(aliceJid, 1, BTBVTrustState.verified);
await btbv.onNewSession(aliceJid, 2);
await btbv.onNewSession(bobJid, 3);
await btbv.onNewSession(bobJid, 4);
final serialized = jsonify(await btbv.toJson());
2023-06-12 17:20:43 +00:00
final deviceList =
BlindTrustBeforeVerificationTrustManager.deviceListFromJson(
serialized,
);
expect(btbv.devices, deviceList);
2023-06-12 17:20:43 +00:00
final trustCache =
BlindTrustBeforeVerificationTrustManager.trustCacheFromJson(
serialized,
);
expect(btbv.trustCache, trustCache);
2023-06-12 17:20:43 +00:00
final enableCache =
BlindTrustBeforeVerificationTrustManager.enableCacheFromJson(
serialized,
);
expect(btbv.enablementCache, enableCache);
2023-06-12 21:39:08 +00:00
});*/
2023-06-14 12:03:11 +00:00
test('Test reading and writing protobuf', () {
final kex = OMEMOKeyExchange.fromBuffer(base64Decode('CFIQqvSv8AEaIHuVKKqf00vYpBIB7PKWheboVKcoKCWkRIUFeokzMYqxIiDOYPRA2vAlHwDLwPn/XIMSmenj3fgUIZHMgUXxVJtedyp8ChA+GfjScvWAllcTavRoyvfIEmgIDhAAGiANff1ES1HdSgtjy9JsoXcAywXJfBmZsFYTKUHRQsCMNiJAAOhS/CMrIdDm+ZZ/fmaOfwD0O7MNUaUMkVahvk4XDAy6mYk65r2TE4REW7h7akcKyoL94YSnTWp8p6fO91VSLA=='));
final newKex = OMEMOKeyExchange.fromBuffer(kex.writeToBuffer());
expect(kex.writeToBuffer(), newKex.writeToBuffer());
});
2022-08-05 15:32:59 +00:00
}