aboutsummaryrefslogtreecommitdiff
path: root/extension/background/emscriptif.js
diff options
context:
space:
mode:
Diffstat (limited to 'extension/background/emscriptif.js')
-rw-r--r--extension/background/emscriptif.js104
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;
}