diff options
Diffstat (limited to 'extension/background/emscriptif.js')
-rw-r--r-- | extension/background/emscriptif.js | 71 |
1 files changed, 41 insertions, 30 deletions
diff --git a/extension/background/emscriptif.js b/extension/background/emscriptif.js index f90f41ec2..ee864c60d 100644 --- a/extension/background/emscriptif.js +++ b/extension/background/emscriptif.js @@ -88,7 +88,8 @@ class Amount extends ArenaObject { } } toNbo(a) { - let x = new AmountNbo(null, a); + let x = new AmountNbo(a); + x.alloc(); emsc.amount_hton(x.nativePtr, this.nativePtr); return x; } @@ -144,32 +145,31 @@ class Amount extends ArenaObject { } } class PackedArenaObject extends ArenaObject { - constructor(init, a) { + constructor(a) { super(a); - if (init === null || init === undefined) { - this.nativePtr = emscAlloc.malloc(this.size()); - } - else { - this.nativePtr = init; - } } - encode() { + stringEncode() { var d = emscAlloc.data_to_string_alloc(this.nativePtr, this.size()); var s = Module.Pointer_stringify(d); emsc.free(d); return s; } - decode(s) { + stringDecode(s) { + this.alloc(); // We need to get the javascript string // to the emscripten heap first. - // XXX: Does this work with multi-bytes code points? - let hstr = emscAlloc.malloc(s.length + 1); - Module.writeStringToMemory(s, hstr); - let res = emsc.string_to_data(hstr, s.length, this.nativePtr, this.size()); + let buf = ByteArray.fromString(s); + let res = emsc.string_to_data(buf.nativePtr, s.length, this.nativePtr, this.size()); + buf.destroy(); if (res < 1) { throw { error: "wrong encoding" }; } } + alloc() { + if (this.nativePtr === null) { + this.nativePtr = emscAlloc.malloc(this.size()); + } + } destroy() { emsc.free(this.nativePtr); this.nativePtr = 0; @@ -185,13 +185,15 @@ class AmountNbo extends PackedArenaObject { } class EddsaPrivateKey extends PackedArenaObject { static create(a) { - let p = emscAlloc.eddsa_key_create(); - return new EddsaPrivateKey(p, a); + let obj = new EddsaPrivateKey(a); + obj.nativePtr = emscAlloc.eddsa_key_create(); + return obj; } size() { return 32; } - getPublicKey() { - let p = emscAlloc.eddsa_public_key_from_private(this.nativePtr); - return new EddsaPublicKey(p, this.arena); + getPublicKey(a) { + let obj = new EddsaPublicKey(a); + obj.nativePtr = emscAlloc.eddsa_public_key_from_private(this.nativePtr); + return obj; } } class EddsaPublicKey extends PackedArenaObject { @@ -203,11 +205,11 @@ class RsaBlindingKey extends ArenaObject { o.nativePtr = emscAlloc.rsa_blinding_key_create(len); return o; } - encode() { + stringEncode() { let ptr = emscAlloc.malloc(PTR_SIZE); let size = emscAlloc.rsa_blinding_key_encode(this.nativePtr, ptr); let res = new ByteArray(size, Module.getValue(ptr, '*')); - let s = res.encode(); + let s = res.stringEncode(); emsc.free(ptr); res.destroy(); return s; @@ -221,7 +223,7 @@ class HashCode extends PackedArenaObject { } class ByteArray extends PackedArenaObject { constructor(desiredSize, init, a) { - super(init, a); + super(a); if (init === undefined || init === null) { this.nativePtr = emscAlloc.malloc(desiredSize); } @@ -231,12 +233,16 @@ class ByteArray extends PackedArenaObject { this.allocatedSize = desiredSize; } size() { return this.allocatedSize; } + static fromString(s, a) { + let hstr = emscAlloc.malloc(s.length + 1); + Module.writeStringToMemory(s, hstr); + return new ByteArray(s.length, hstr, a); + } } class EccSignaturePurpose extends PackedArenaObject { constructor(purpose, payload, a) { - this.payload = payload; - let p = emscAlloc.purpose_create(purpose, payload.nativePtr, payload.size()); - super(p, a); + super(a); + this.nativePtr = emscAlloc.purpose_create(purpose, payload.nativePtr, payload.size()); } size() { return this.payload.size() + 8; } } @@ -294,12 +300,11 @@ class WithdrawRequestPS extends SignatureStruct { } } class RsaPublicKey extends ArenaObject { - static decode(s, a) { + static stringDecode(s, a) { let obj = new RsaPublicKey(a); - let hstr = emscAlloc.malloc(s.length + 1); - Module.writeStringToMemory(s, hstr); - obj.nativePtr = emscAlloc.rsa_public_key_decode(hstr, s.length); - emsc.free(hstr); + let buf = ByteArray.fromString(s); + obj.nativePtr = emscAlloc.rsa_public_key_decode(buf.nativePtr, s.length); + buf.destroy(); return obj; } destroy() { @@ -307,9 +312,15 @@ class RsaPublicKey extends ArenaObject { this.nativePtr = 0; } } +class EddsaSignature extends PackedArenaObject { + size() { return 64; } +} function rsaBlind(hashCode, blindingKey, pkey, arena) { let ptr = emscAlloc.malloc(PTR_SIZE); let s = emscAlloc.rsa_blind(hashCode.nativePtr, blindingKey.nativePtr, pkey.nativePtr, ptr); let res = new ByteArray(s, Module.getValue(ptr, '*'), arena); return res; } +function eddsaSign(purpose, priv, a) { + throw "Not implemented"; +} |