From 9d43bd45ecdaa2874dc2b110f3f1f03019ef1bad Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Mon, 14 Dec 2015 09:39:02 +0100 Subject: [PATCH] More consistency. --- extension/background/emscriptif.js | 71 +++++++++++++++------------ extension/background/emscriptif.ts | 79 +++++++++++++++++++----------- extension/background/wallet.js | 17 +++++-- extension/background/wallet.ts | 18 ++++--- 4 files changed, 115 insertions(+), 70 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"; +} diff --git a/extension/background/emscriptif.ts b/extension/background/emscriptif.ts index ef14065a7..5ca4fef24 100644 --- a/extension/background/emscriptif.ts +++ b/extension/background/emscriptif.ts @@ -156,7 +156,8 @@ class Amount extends ArenaObject { } toNbo(a?: Arena): AmountNbo { - let x = new AmountNbo(null, a); + let x = new AmountNbo(a); + x.alloc(); emsc.amount_hton(x.nativePtr, this.nativePtr); return x; } @@ -225,34 +226,35 @@ class Amount extends ArenaObject { abstract class PackedArenaObject extends ArenaObject { abstract size(): number; - constructor(init?: number, a?: Arena) { + constructor(a?: Arena) { super(a); - if (init === null || init === undefined) { - this.nativePtr = emscAlloc.malloc(this.size()); - } else { - this.nativePtr = init; - } } - encode(): string { + stringEncode(): string { var d = emscAlloc.data_to_string_alloc(this.nativePtr, this.size()); var s = Module.Pointer_stringify(d); emsc.free(d); return s; } - decode(s: string) { + stringDecode(s: string) { + 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; @@ -273,15 +275,17 @@ class AmountNbo extends PackedArenaObject { class EddsaPrivateKey extends PackedArenaObject { static create(a?: Arena): EddsaPrivateKey { - 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(): EddsaPublicKey { - let p = emscAlloc.eddsa_public_key_from_private(this.nativePtr); - return new EddsaPublicKey(p, this.arena); + getPublicKey(a?: Arena): EddsaPublicKey { + let obj = new EddsaPublicKey(a); + obj.nativePtr = emscAlloc.eddsa_public_key_from_private(this.nativePtr); + return obj; } } @@ -298,11 +302,11 @@ class RsaBlindingKey extends ArenaObject { return o; } - encode(): string { + stringEncode(): string { 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; @@ -322,8 +326,9 @@ class HashCode extends PackedArenaObject { class ByteArray extends PackedArenaObject { private allocatedSize: number; size() { return this.allocatedSize; } + constructor(desiredSize: number, init: number, a?: Arena) { - super(init, a); + super(a); if (init === undefined || init === null) { this.nativePtr = emscAlloc.malloc(desiredSize); } else { @@ -331,6 +336,12 @@ class ByteArray extends PackedArenaObject { } this.allocatedSize = desiredSize; } + + static fromString(s: string, a?: Arena): ByteArray { + let hstr = emscAlloc.malloc(s.length + 1); + Module.writeStringToMemory(s, hstr); + return new ByteArray(s.length, hstr, a); + } } @@ -338,9 +349,8 @@ class EccSignaturePurpose extends PackedArenaObject { size() { return this.payload.size() + 8; } payload: PackedArenaObject; constructor(purpose: SignaturePurpose, payload: PackedArenaObject, a?: Arena) { - 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()); } } @@ -403,12 +413,11 @@ class WithdrawRequestPS extends SignatureStruct { class RsaPublicKey extends ArenaObject { - static decode(s: string, a?: Arena): RsaPublicKey { + static stringDecode(s: string, a?: Arena): RsaPublicKey { 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; } @@ -418,6 +427,10 @@ class RsaPublicKey extends ArenaObject { } } +class EddsaSignature extends PackedArenaObject { + size() { return 64; } +} + function rsaBlind(hashCode: HashCode, blindingKey: RsaBlindingKey, @@ -430,3 +443,11 @@ function rsaBlind(hashCode: HashCode, return res; } + +function eddsaSign(purpose: EccSignaturePurpose, + priv: EddsaPrivateKey, + a?: Arena): EddsaSignature +{ + throw "Not implemented"; +} + diff --git a/extension/background/wallet.js b/extension/background/wallet.js index 7011280fa..3281c0d07 100644 --- a/extension/background/wallet.js +++ b/extension/background/wallet.js @@ -50,7 +50,7 @@ function confirmReserve(db, detail, sendResponse) { let form = new FormData(); let now = (new Date()).toString(); form.append(detail.field_amount, detail.amount_str); - form.append(detail.field_reserve_pub, reservePub.encode()); + form.append(detail.field_reserve_pub, reservePub.stringEncode()); form.append(detail.field_mint, detail.mint); // XXX: set bank-specified fields. let myRequest = new XMLHttpRequest(); @@ -68,8 +68,8 @@ function confirmReserve(db, detail, sendResponse) { backlink: undefined }; let reserveRecord = { - reserve_pub: reservePub.encode(), - reserve_priv: reservePriv.encode(), + reserve_pub: reservePub.stringEncode(), + reserve_priv: reservePriv.stringEncode(), mint_base_url: mintBaseUrl, created: now, last_query: null, @@ -115,13 +115,20 @@ function withdraw(denom, reserve, mint) { denom_pub: denom.denom_pub, reserve_pub: reserve.reserve_pub, }; - let denomPub = RsaPublicKey.decode(denom.denom_pub); + let reservePriv = new EddsaPrivateKey(); + reservePriv.stringDecode(reserve.reserve_priv); + let reservePub = new EddsaPublicKey(); + reservePub.stringDecode(reserve.reserve_pub); + let denomPub = RsaPublicKey.stringDecode(denom.denom_pub); let coinPriv = EddsaPrivateKey.create(); let coinPub = coinPriv.getPublicKey(); let blindingFactor = RsaBlindingKey.create(1024); let pubHash = coinPub.hash(); let ev = rsaBlind(pubHash, blindingFactor, denomPub); - // generate signature + // Signature + let withdrawRequest = new WithdrawRequestPS(); + withdrawRequest.set("reserve_pub", reservePub); + var sig = eddsaSign(withdrawRequest.toPurpose(), reservePriv); } /** * Withdraw coins from a reserve until it is empty. diff --git a/extension/background/wallet.ts b/extension/background/wallet.ts index 040b7b6a9..751087c7c 100644 --- a/extension/background/wallet.ts +++ b/extension/background/wallet.ts @@ -57,7 +57,7 @@ function confirmReserve(db, detail, sendResponse) { let form = new FormData(); let now = (new Date()).toString(); form.append(detail.field_amount, detail.amount_str); - form.append(detail.field_reserve_pub, reservePub.encode()); + form.append(detail.field_reserve_pub, reservePub.stringEncode()); form.append(detail.field_mint, detail.mint); // XXX: set bank-specified fields. let myRequest = new XMLHttpRequest(); @@ -75,8 +75,8 @@ function confirmReserve(db, detail, sendResponse) { backlink: undefined }; let reserveRecord = { - reserve_pub: reservePub.encode(), - reserve_priv: reservePriv.encode(), + reserve_pub: reservePub.stringEncode(), + reserve_priv: reservePriv.stringEncode(), mint_base_url: mintBaseUrl, created: now, last_query: null, @@ -128,14 +128,20 @@ function withdraw(denom, reserve, mint) { denom_pub: denom.denom_pub, reserve_pub: reserve.reserve_pub, }; - let denomPub = RsaPublicKey.decode(denom.denom_pub); + let reservePriv = new EddsaPrivateKey(); + reservePriv.stringDecode(reserve.reserve_priv); + let reservePub = new EddsaPublicKey(); + reservePub.stringDecode(reserve.reserve_pub); + let denomPub = RsaPublicKey.stringDecode(denom.denom_pub); let coinPriv = EddsaPrivateKey.create(); let coinPub = coinPriv.getPublicKey(); let blindingFactor = RsaBlindingKey.create(1024); let pubHash = coinPub.hash(); let ev = rsaBlind(pubHash, blindingFactor, denomPub); - - // generate signature + // Signature + let withdrawRequest = new WithdrawRequestPS(); + withdrawRequest.set("reserve_pub", reservePub); + var sig = eddsaSign(withdrawRequest.toPurpose(), reservePriv); }