diff options
author | Florian Dold <florian.dold@gmail.com> | 2015-12-16 05:53:55 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2015-12-16 05:53:55 +0100 |
commit | 331547059868a0e36acf5f2efac71ecbd1a96c8c (patch) | |
tree | 9dae9645110e7bcf3feb907876e7118256f76965 /extension/background/emscriptif.js | |
parent | ccce0f9749f756fb4c681dc23d2386dc2f85dc6d (diff) |
show badge
Diffstat (limited to 'extension/background/emscriptif.js')
-rw-r--r-- | extension/background/emscriptif.js | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/extension/background/emscriptif.js b/extension/background/emscriptif.js index 11260c74d..3c5dabe7c 100644 --- a/extension/background/emscriptif.js +++ b/extension/background/emscriptif.js @@ -56,6 +56,7 @@ var emscAlloc = { rsa_public_key_decode: getEmsc('GNUNET_CRYPTO_rsa_public_key_decode', 'number', ['number', 'number']), rsa_signature_decode: getEmsc('GNUNET_CRYPTO_rsa_signature_decode', 'number', ['number', 'number']), rsa_public_key_encode: getEmsc('GNUNET_CRYPTO_rsa_public_key_encode', 'number', ['number', 'number']), + rsa_unblind: getEmsc('GNUNET_CRYPTO_rsa_unblind', 'number', ['number', 'number', 'number']), malloc: (size) => Module._malloc(size), }; var SignaturePurpose; @@ -71,8 +72,12 @@ var RandomQuality; class ArenaObject { constructor(arena) { this.nativePtr = null; - if (!arena) - arena = defaultArena; + if (!arena) { + if (arenaStack.length == 0) { + throw Error("No arena available"); + } + arena = arenaStack[arenaStack.length - 1]; + } arena.put(this); this.arena = arena; } @@ -110,7 +115,7 @@ class ArenaObject { return this.getNative(); } } -class Arena { +class DefaultArena { constructor() { this.heap = []; } @@ -118,11 +123,32 @@ class Arena { this.heap.push(obj); } destroy() { - // XXX: todo + for (let obj of this.heap) { + obj.destroy(); + } + this.heap = []; + } +} +/** + * Arena that destroys all its objects once control has returned to the message + * loop and a small interval has passed. + */ +class SyncArena extends DefaultArena { + constructor() { + super(); + let me = this; + this.timer = new Worker('background/timerThread.js'); + this.timer.onmessage = (e) => { + this.destroy(); + }; + //this.timer.postMessage({interval: 50}); + } + destroy() { + super.destroy(); } } -// Arena to track allocations that do not use an explicit arena. -var defaultArena = new Arena(); +let arenaStack = []; +arenaStack.push(new SyncArena()); class Amount extends ArenaObject { constructor(args, arena) { super(arena); @@ -450,6 +476,8 @@ function eddsaSign(purpose, priv, a) { } return sig; } -function rsaUnblind(sig, bk, pk) { - throw Error("Not implemented"); +function rsaUnblind(sig, bk, pk, a) { + let x = new RsaSignature(a); + x.nativePtr = emscAlloc.rsa_unblind(sig.nativePtr, bk.nativePtr, pk.nativePtr); + return x; } |