keys from backup need to be imported with import_session, not create

This commit is contained in:
Bruno Windels 2020-09-17 17:59:02 +02:00
parent 915925d6ee
commit 1b8e481559

View File

@ -138,10 +138,16 @@ export class Decryption {
return; return;
} }
const sessionEntry = await this._writeInboundSession( const session = new this._olm.InboundGroupSession();
roomId, senderKey, claimedEd25519Key, sessionId, sessionKey, txn); try {
if (sessionEntry) { session.create(sessionKey);
newSessions.push(sessionEntry); const sessionEntry = await this._writeInboundSession(
session, roomId, senderKey, claimedEd25519Key, sessionId, txn);
if (sessionEntry) {
newSessions.push(sessionEntry);
}
} finally {
session.free();
} }
} }
// this will be passed to the Room in notifyRoomKeys // this will be passed to the Room in notifyRoomKeys
@ -171,41 +177,40 @@ export class Decryption {
) { ) {
return; return;
} }
return await this._writeInboundSession(
roomId, senderKey, claimedEd25519Key, sessionId, sessionKey, txn);
}
async _writeInboundSession(roomId, senderKey, claimedEd25519Key, sessionId, sessionKey, txn) {
const session = new this._olm.InboundGroupSession(); const session = new this._olm.InboundGroupSession();
try { try {
session.create(sessionKey); session.import_session(sessionKey);
return await this._writeInboundSession(
let incomingSessionIsBetter = true; session, roomId, senderKey, claimedEd25519Key, sessionId, txn);
const existingSessionEntry = await txn.inboundGroupSessions.get(roomId, senderKey, sessionId);
if (existingSessionEntry) {
const existingSession = new this._olm.InboundGroupSession();
try {
existingSession.unpickle(this._pickleKey, existingSessionEntry.session);
incomingSessionIsBetter = session.first_known_index() < existingSession.first_known_index();
} finally {
existingSession.free();
}
}
if (incomingSessionIsBetter) {
const sessionEntry = {
roomId,
senderKey,
sessionId,
session: session.pickle(this._pickleKey),
claimedKeys: {ed25519: claimedEd25519Key},
};
txn.inboundGroupSessions.set(sessionEntry);
return sessionEntry;
}
} finally { } finally {
session.free(); session.free();
} }
} }
async _writeInboundSession(session, roomId, senderKey, claimedEd25519Key, sessionId, txn) {
let incomingSessionIsBetter = true;
const existingSessionEntry = await txn.inboundGroupSessions.get(roomId, senderKey, sessionId);
if (existingSessionEntry) {
const existingSession = new this._olm.InboundGroupSession();
try {
existingSession.unpickle(this._pickleKey, existingSessionEntry.session);
incomingSessionIsBetter = session.first_known_index() < existingSession.first_known_index();
} finally {
existingSession.free();
}
}
if (incomingSessionIsBetter) {
const sessionEntry = {
roomId,
senderKey,
sessionId,
session: session.pickle(this._pickleKey),
claimedKeys: {ed25519: claimedEd25519Key},
};
txn.inboundGroupSessions.set(sessionEntry);
return sessionEntry;
}
}
} }