summaryrefslogtreecommitdiffstats
path: root/comm/chat/content/otrWorker.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/chat/content/otrWorker.js')
-rw-r--r--comm/chat/content/otrWorker.js61
1 files changed, 61 insertions, 0 deletions
diff --git a/comm/chat/content/otrWorker.js b/comm/chat/content/otrWorker.js
new file mode 100644
index 0000000000..32d96ea9dd
--- /dev/null
+++ b/comm/chat/content/otrWorker.js
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* eslint-env mozilla/chrome-worker, node */
+importScripts("resource://gre/modules/workers/require.js");
+var PromiseWorker = require("resource://gre/modules/workers/PromiseWorker.js");
+var Funcs = {};
+
+// Only what we need from libotr.js
+Funcs.generateKey = function (path, otrl_version, address) {
+ let libotr = ctypes.open(path);
+
+ let abi = ctypes.default_abi;
+ let gcry_error_t = ctypes.unsigned_int;
+
+ // Initialize the OTR library. Pass the version of the API you are using.
+ let otrl_init = libotr.declare(
+ "otrl_init",
+ abi,
+ gcry_error_t,
+ ctypes.unsigned_int,
+ ctypes.unsigned_int,
+ ctypes.unsigned_int
+ );
+
+ // Do the private key generation calculation. You may call this from a
+ // background thread. When it completes, call
+ // otrl_privkey_generate_finish from the _main_ thread.
+ let otrl_privkey_generate_calculate = libotr.declare(
+ "otrl_privkey_generate_calculate",
+ abi,
+ gcry_error_t,
+ ctypes.void_t.ptr
+ );
+
+ otrl_init.apply(libotr, otrl_version);
+
+ let newkey = ctypes.voidptr_t(ctypes.UInt64("0x" + address));
+ let err = otrl_privkey_generate_calculate(newkey);
+ libotr.close();
+ if (err) {
+ throw new Error("otrl_privkey_generate_calculate (" + err + ")");
+ }
+};
+
+var worker = new PromiseWorker.AbstractWorker();
+
+worker.dispatch = function (method, args = []) {
+ return Funcs[method](...args);
+};
+
+worker.postMessage = function (res, ...args) {
+ self.postMessage(res, ...args);
+};
+
+worker.close = function () {
+ self.close();
+};
+
+self.addEventListener("message", msg => worker.handleMessage(msg));