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
Once everything moves to indexeddb, it's going to require callbacks and the like, so let's make the decrypt API asynchronous in preparation.
166 lines
5.5 KiB
JavaScript
166 lines
5.5 KiB
JavaScript
try {
|
|
global.Olm = require('olm');
|
|
} catch (e) {
|
|
console.warn("unable to run megolm tests: libolm not available");
|
|
}
|
|
|
|
import expect from 'expect';
|
|
import Promise from 'bluebird';
|
|
|
|
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',
|
|
})),
|
|
},
|
|
});
|
|
|
|
return megolmDecryption.decryptEvent(event).then(() => {
|
|
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);
|
|
|
|
const awaitEnsureSessions = new Promise((res, rej) => {
|
|
mockOlmLib.ensureOlmSessionsForDevices.andCall(() => {
|
|
res();
|
|
return Promise.resolve({'@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 awaitEnsureSessions.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();
|
|
});
|
|
});
|
|
});
|
|
});
|