diff options
Diffstat (limited to 'extension/background/emscriptif.js')
-rw-r--r-- | extension/background/emscriptif.js | 104 |
1 files changed, 84 insertions, 20 deletions
diff --git a/extension/background/emscriptif.js b/extension/background/emscriptif.js index a4e50b89e..0e4f2a209 100644 --- a/extension/background/emscriptif.js +++ b/extension/background/emscriptif.js @@ -17,6 +17,10 @@ "use strict"; // Size of a native pointer. const PTR_SIZE = 4; +const GNUNET_OK = 1; +const GNUNET_YES = 1; +const GNUNET_NO = 0; +const GNUNET_SYSERR = -1; let getEmsc = Module.cwrap; var emsc = { free: (ptr) => Module._free(ptr), @@ -32,7 +36,9 @@ var emsc = { hash: getEmsc('GNUNET_CRYPTO_hash', 'void', ['number', 'number', 'number']), memmove: getEmsc('memmove', 'number', ['number', 'number', 'number']), rsa_public_key_free: getEmsc('GNUNET_CRYPTO_rsa_public_key_free', 'void', ['number']), - string_to_data: getEmsc('GNUNET_STRINGS_string_to_data', 'void', ['number', 'number', 'number', 'number']) + string_to_data: getEmsc('GNUNET_STRINGS_string_to_data', 'void', ['number', 'number', 'number', 'number']), + eddsa_sign: getEmsc('GNUNET_CRYPTO_eddsa_sign', 'number', ['number', 'number', 'number']), + hash_create_random: getEmsc('GNUNET_CRYPTO_hash_create_random', 'void', ['number', 'number']), }; var emscAlloc = { get_amount: getEmsc('TALER_WRALL_get_amount', 'number', ['number', 'number', 'number', 'string']), @@ -45,14 +51,22 @@ var emscAlloc = { rsa_blinding_key_encode: getEmsc('GNUNET_CRYPTO_rsa_blinding_key_encode', 'void', ['number', 'number']), rsa_blinding_key_decode: getEmsc('GNUNET_CRYPTO_rsa_blinding_key_decode', 'number', ['number', 'number']), rsa_public_key_decode: getEmsc('GNUNET_CRYPTO_rsa_public_key_decode', 'number', ['number', 'number']), + rsa_public_key_encode: getEmsc('GNUNET_CRYPTO_rsa_public_key_encode', 'number', ['number', 'number']), malloc: (size) => Module._malloc(size), }; var SignaturePurpose; (function (SignaturePurpose) { + SignaturePurpose[SignaturePurpose["RESERVE_WITHDRAW"] = 1200] = "RESERVE_WITHDRAW"; })(SignaturePurpose || (SignaturePurpose = {})); +var RandomQuality; +(function (RandomQuality) { + RandomQuality[RandomQuality["WEAK"] = 0] = "WEAK"; + RandomQuality[RandomQuality["STRONG"] = 1] = "STRONG"; + RandomQuality[RandomQuality["NONCE"] = 2] = "NONCE"; +})(RandomQuality || (RandomQuality = {})); class ArenaObject { constructor(arena) { - this.nativePtr = 0; + this.nativePtr = null; if (!arena) arena = defaultArena; arena.put(this); @@ -66,7 +80,7 @@ class Arena { put(obj) { this.heap.push(obj); } - destroy(obj) { + destroy() { // XXX: todo } } @@ -149,13 +163,13 @@ class PackedArenaObject extends ArenaObject { constructor(a) { super(a); } - stringEncode() { + toCrock() { var d = emscAlloc.data_to_string_alloc(this.nativePtr, this.size()); var s = Module.Pointer_stringify(d); emsc.free(d); return s; } - stringDecode(s) { + loadCrock(s) { this.alloc(); // We need to get the javascript string // to the emscripten heap first. @@ -177,6 +191,7 @@ class PackedArenaObject extends ArenaObject { } hash() { var x = new HashCode(); + x.alloc(); emsc.hash(this.nativePtr, this.size(), x.nativePtr); return x; } @@ -206,11 +221,11 @@ class RsaBlindingKey extends ArenaObject { o.nativePtr = emscAlloc.rsa_blinding_key_create(len); return o; } - stringEncode() { + toCrock() { 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.stringEncode(); + let s = res.toCrock(); emsc.free(ptr); res.destroy(); return s; @@ -221,6 +236,27 @@ class RsaBlindingKey extends ArenaObject { } class HashCode extends PackedArenaObject { size() { return 64; } + random(qualStr) { + let qual; + switch (qualStr) { + case "weak": + qual = RandomQuality.WEAK; + break; + case "strong": + case null: + case undefined: + qual = RandomQuality.STRONG; + break; + case "nonce": + qual = RandomQuality.NONCE; + break; + break; + default: + throw Error(format("unknown crypto quality: {0}", qual)); + } + this.alloc(); + emsc.hash_create_random(qual, this.nativePtr); + } } class ByteArray extends PackedArenaObject { constructor(desiredSize, init, a) { @@ -239,13 +275,26 @@ class ByteArray extends PackedArenaObject { Module.writeStringToMemory(s, hstr); return new ByteArray(s.length, hstr, a); } + static fromCrock(s, a) { + let hstr = emscAlloc.malloc(s.length + 1); + Module.writeStringToMemory(s, hstr); + let decodedLen = Math.floor((s.length * 5) / 8); + let ba = new ByteArray(decodedLen, null, a); + let res = emsc.string_to_data(hstr, s.length, ba.nativePtr, decodedLen); + emsc.free(hstr); + if (res != GNUNET_OK) { + throw Error("decoding failed"); + } + return ba; + } } class EccSignaturePurpose extends PackedArenaObject { constructor(purpose, payload, a) { super(a); this.nativePtr = emscAlloc.purpose_create(purpose, payload.nativePtr, payload.size()); + this.payloadSize = payload.size(); } - size() { return this.payload.size() + 8; } + size() { return this.payloadSize + 8; } } class SignatureStruct { constructor() { @@ -259,7 +308,7 @@ class SignatureStruct { if (!member) { throw Error(format("Member {0} not set", name)); } - totalSize += this.members[name].size(); + totalSize += member.size(); } let buf = emscAlloc.malloc(totalSize); let ptr = buf; @@ -271,7 +320,7 @@ class SignatureStruct { ptr += size; } let ba = new ByteArray(totalSize, buf, a); - let x = new EccSignaturePurpose(this.purpose(), ba, a); + let x = new EccSignaturePurpose(this.purpose(), ba); return x; } set(name, value) { @@ -280,38 +329,47 @@ class SignatureStruct { typemap[f[0]] = f[1]; } if (!(name in typemap)) { - throw { error: "Key not found", key: name }; + throw Error(format("Key {0} not found", name)); } if (!(value instanceof typemap[name])) { - throw { error: "Wrong type", key: name }; + throw Error(format("Wrong type for {0}", name)); } - // TODO: check type! this.members[name] = value; } } class WithdrawRequestPS extends SignatureStruct { - purpose() { return undefined; } + purpose() { return SignaturePurpose.RESERVE_WITHDRAW; } fieldTypes() { return [ ["reserve_pub", EddsaPublicKey], - ["amount_with_fee", Amount], - ["withdraw_fee", Amount], + ["amount_with_fee", AmountNbo], + ["withdraw_fee", AmountNbo], ["h_denomination_pub", HashCode], ["h_coin_envelope", HashCode]]; } } class RsaPublicKey extends ArenaObject { - static stringDecode(s, a) { + static fromCrock(s, a) { let obj = new RsaPublicKey(a); - let buf = ByteArray.fromString(s); - obj.nativePtr = emscAlloc.rsa_public_key_decode(buf.nativePtr, s.length); + let buf = ByteArray.fromCrock(s); + obj.nativePtr = emscAlloc.rsa_public_key_decode(buf.nativePtr, buf.size()); buf.destroy(); return obj; } + toCrock() { + return this.encode().toCrock(); + } destroy() { emsc.rsa_public_key_free(this.nativePtr); this.nativePtr = 0; } + encode(arena) { + let ptr = emscAlloc.malloc(PTR_SIZE); + let len = emscAlloc.rsa_public_key_encode(this.nativePtr, ptr); + let res = new ByteArray(len, Module.getValue(ptr, '*'), arena); + emsc.free(ptr); + return res; + } } class EddsaSignature extends PackedArenaObject { size() { return 64; } @@ -323,5 +381,11 @@ function rsaBlind(hashCode, blindingKey, pkey, arena) { return res; } function eddsaSign(purpose, priv, a) { - throw "Not implemented"; + let sig = new EddsaSignature(a); + sig.alloc(); + let res = emsc.eddsa_sign(priv.nativePtr, purpose.nativePtr, sig.nativePtr); + if (res < 1) { + throw Error("EdDSA signing failed"); + } + return sig; } |