2020-09-10 16:30:11 +05:30
|
|
|
/*
|
|
|
|
Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2020-09-11 14:13:17 +05:30
|
|
|
export class OlmWorker {
|
2020-09-10 20:10:30 +05:30
|
|
|
constructor(workerPool) {
|
|
|
|
this._workerPool = workerPool;
|
2020-09-10 16:30:11 +05:30
|
|
|
}
|
|
|
|
|
2020-09-11 14:13:17 +05:30
|
|
|
megolmDecrypt(session, ciphertext) {
|
2020-09-10 16:30:11 +05:30
|
|
|
const sessionKey = session.export_session(session.first_known_index());
|
2020-09-10 20:10:30 +05:30
|
|
|
return this._workerPool.send({type: "megolm_decrypt", ciphertext, sessionKey});
|
2020-09-10 16:30:11 +05:30
|
|
|
}
|
2020-09-11 14:13:17 +05:30
|
|
|
|
|
|
|
async createAccountAndOTKs(account, otkAmount) {
|
|
|
|
// IE11 does not support getRandomValues in a worker, so we have to generate the values upfront.
|
|
|
|
let randomValues;
|
|
|
|
if (window.msCrypto) {
|
|
|
|
randomValues = [
|
|
|
|
window.msCrypto.getRandomValues(new Uint8Array(64)),
|
|
|
|
window.msCrypto.getRandomValues(new Uint8Array(otkAmount * 32)),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
const pickle = await this._workerPool.send({type: "olm_create_account_otks", randomValues, otkAmount}).response();
|
|
|
|
account.unpickle("", pickle);
|
|
|
|
}
|
|
|
|
|
2020-11-10 23:00:48 +05:30
|
|
|
async createOutboundOlmSession(account, newSession, theirIdentityKey, theirOneTimeKey) {
|
2020-11-10 15:34:09 +05:30
|
|
|
const accountPickle = account.pickle("");
|
2020-11-10 23:01:18 +05:30
|
|
|
let randomValues;
|
|
|
|
if (window.msCrypto) {
|
|
|
|
randomValues = [
|
|
|
|
window.msCrypto.getRandomValues(new Uint8Array(64)),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
const sessionPickle = await this._workerPool.send({type: "olm_create_outbound", accountPickle, theirIdentityKey, theirOneTimeKey, randomValues}).response();
|
2020-11-10 15:34:09 +05:30
|
|
|
newSession.unpickle("", sessionPickle);
|
|
|
|
}
|
|
|
|
|
2020-09-11 14:13:17 +05:30
|
|
|
dispose() {
|
|
|
|
this._workerPool.dispose();
|
|
|
|
}
|
2020-09-10 16:30:11 +05:30
|
|
|
}
|