You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-08-09 10:22:46 +03:00
when we receive a m.forwarded_room_key, add it to the crypto store, but remember who forwarded it to us, so we can decide whether to trust them separately.
161 lines
5.2 KiB
JavaScript
161 lines
5.2 KiB
JavaScript
try {
|
|
global.Olm = require('olm');
|
|
} catch (e) {
|
|
console.warn("unable to run megolm tests: libolm not available");
|
|
}
|
|
|
|
import expect from 'expect';
|
|
import q from 'q';
|
|
|
|
import sdk from '../../../..';
|
|
import algorithms from '../../../../lib/crypto/algorithms';
|
|
import WebStorageSessionStore from '../../../../lib/store/session/webstorage';
|
|
import MockStorageApi from '../../../MockStorageApi';
|
|
import testUtils from '../../../test-utils';
|
|
|
|
// Crypto and OlmDevice won't import unless we have global.Olm
|
|
let OlmDevice;
|
|
let Crypto;
|
|
if (global.Olm) {
|
|
OlmDevice = require('../../../../lib/crypto/OlmDevice');
|
|
Crypto = require('../../../../lib/crypto');
|
|
}
|
|
|
|
const MatrixEvent = sdk.MatrixEvent;
|
|
const MegolmDecryption = algorithms.DECRYPTION_CLASSES['m.megolm.v1.aes-sha2'];
|
|
|
|
const ROOM_ID = '!ROOM:ID';
|
|
|
|
describe("MegolmDecryption", function() {
|
|
if (!global.Olm) {
|
|
console.warn('Not running megolm unit tests: libolm not present');
|
|
return;
|
|
}
|
|
|
|
let megolmDecryption;
|
|
let mockOlmLib;
|
|
let mockCrypto;
|
|
let mockBaseApis;
|
|
|
|
beforeEach(function() {
|
|
testUtils.beforeEach(this); // eslint-disable-line no-invalid-this
|
|
|
|
mockCrypto = testUtils.mock(Crypto, 'Crypto');
|
|
mockBaseApis = {};
|
|
|
|
const mockStorage = new MockStorageApi();
|
|
const sessionStore = new WebStorageSessionStore(mockStorage);
|
|
|
|
const olmDevice = new OlmDevice(sessionStore);
|
|
|
|
megolmDecryption = new MegolmDecryption({
|
|
userId: '@user:id',
|
|
crypto: mockCrypto,
|
|
olmDevice: olmDevice,
|
|
baseApis: mockBaseApis,
|
|
roomId: ROOM_ID,
|
|
});
|
|
|
|
|
|
// we stub out the olm encryption bits
|
|
mockOlmLib = {};
|
|
mockOlmLib.ensureOlmSessionsForDevices = expect.createSpy();
|
|
mockOlmLib.encryptMessageForDevice = expect.createSpy();
|
|
megolmDecryption.olmlib = mockOlmLib;
|
|
});
|
|
|
|
describe('receives some keys:', function() {
|
|
let groupSession;
|
|
beforeEach(function() {
|
|
groupSession = new global.Olm.OutboundGroupSession();
|
|
groupSession.create();
|
|
|
|
const event = new MatrixEvent({});
|
|
event.setClearData(
|
|
{
|
|
type: 'm.room_key',
|
|
content: {
|
|
algorithm: 'm.megolm.v1.aes-sha2',
|
|
room_id: ROOM_ID,
|
|
session_id: groupSession.session_id(),
|
|
session_key: groupSession.session_key(),
|
|
},
|
|
},
|
|
"SENDER_CURVE25519",
|
|
"SENDER_ED25519",
|
|
);
|
|
|
|
megolmDecryption.onRoomKeyEvent(event);
|
|
});
|
|
|
|
it('can decrypt an event', function() {
|
|
const event = new MatrixEvent({
|
|
type: 'm.room.encrypted',
|
|
room_id: ROOM_ID,
|
|
content: {
|
|
algorithm: 'm.megolm.v1.aes-sha2',
|
|
sender_key: "SENDER_CURVE25519",
|
|
session_id: groupSession.session_id(),
|
|
ciphertext: groupSession.encrypt(JSON.stringify({
|
|
room_id: ROOM_ID,
|
|
content: 'testytest',
|
|
})),
|
|
},
|
|
});
|
|
|
|
megolmDecryption.decryptEvent(event);
|
|
expect(event.getContent()).toEqual('testytest');
|
|
});
|
|
|
|
it('can respond to a key request event', function() {
|
|
const keyRequest = {
|
|
userId: '@alice:foo',
|
|
deviceId: 'alidevice',
|
|
requestBody: {
|
|
room_id: ROOM_ID,
|
|
sender_key: "SENDER_CURVE25519",
|
|
session_id: groupSession.session_id(),
|
|
},
|
|
};
|
|
|
|
expect(megolmDecryption.hasKeysForKeyRequest(keyRequest))
|
|
.toBe(true);
|
|
|
|
// set up some pre-conditions for the share call
|
|
const deviceInfo = {};
|
|
mockCrypto.getStoredDevice.andReturn(deviceInfo);
|
|
mockOlmLib.ensureOlmSessionsForDevices.andReturn(
|
|
q({'@alice:foo': {'alidevice': {
|
|
sessionId: 'alisession',
|
|
}}}),
|
|
);
|
|
mockBaseApis.sendToDevice = expect.createSpy();
|
|
|
|
|
|
// do the share
|
|
megolmDecryption.shareKeysWithDevice(keyRequest);
|
|
|
|
// it's asynchronous, so we have to wait a bit
|
|
return q.delay(1).then(() => {
|
|
// check that it called encryptMessageForDevice with
|
|
// appropriate args.
|
|
expect(mockOlmLib.encryptMessageForDevice.calls.length)
|
|
.toEqual(1);
|
|
|
|
const call = mockOlmLib.encryptMessageForDevice.calls[0];
|
|
const payload = call.arguments[6];
|
|
|
|
expect(payload.type).toEqual("m.forwarded_room_key");
|
|
expect(payload.content).toInclude({
|
|
sender_key: "SENDER_CURVE25519",
|
|
sender_claimed_ed25519_key: "SENDER_ED25519",
|
|
session_id: groupSession.session_id(),
|
|
chain_index: 0,
|
|
forwarding_curve25519_key_chain: [],
|
|
});
|
|
expect(payload.content.session_key).toExist();
|
|
});
|
|
});
|
|
});
|
|
});
|