diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-11-30 04:07:36 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-12-01 03:00:09 +0100 |
commit | b8ccc7c990a1542cf80578b41972f9a5b0870af9 (patch) | |
tree | 6f16319f9ce3133c4c4617129a516e692cfc3ac1 /src/crypto | |
parent | bc2c4aff8e657c7d5709433f137299491b98d257 (diff) |
partial implementation of tipping
Diffstat (limited to 'src/crypto')
-rw-r--r-- | src/crypto/cryptoApi.ts | 5 | ||||
-rw-r--r-- | src/crypto/cryptoWorker.ts | 31 |
2 files changed, 36 insertions, 0 deletions
diff --git a/src/crypto/cryptoApi.ts b/src/crypto/cryptoApi.ts index 00013f0d3..5300c1370 100644 --- a/src/crypto/cryptoApi.ts +++ b/src/crypto/cryptoApi.ts @@ -34,6 +34,7 @@ import { PreCoinRecord, RefreshSessionRecord, ReserveRecord, + TipPlanchet, WireFee, } from "../types"; @@ -253,6 +254,10 @@ export class CryptoApi { return this.doRpc<PreCoinRecord>("createPreCoin", 1, denom, reserve); } + createTipPlanchet(denom: DenominationRecord): Promise<TipPlanchet> { + return this.doRpc<TipPlanchet>("createTipPlanchet", 1, denom); + } + hashString(str: string): Promise<string> { return this.doRpc<string>("hashString", 1, str); } diff --git a/src/crypto/cryptoWorker.ts b/src/crypto/cryptoWorker.ts index 0a93fcb07..5ec7c18e5 100644 --- a/src/crypto/cryptoWorker.ts +++ b/src/crypto/cryptoWorker.ts @@ -40,6 +40,7 @@ import { RefreshPreCoinRecord, RefreshSessionRecord, ReserveRecord, + TipPlanchet, WireFee, } from "../types"; @@ -103,6 +104,7 @@ namespace RpcFunctions { coinValue: denom.value, denomPub: denomPub.encode().toCrock(), exchangeBaseUrl: reserve.exchange_base_url, + isFromTip: false, reservePub: reservePub.toCrock(), withdrawSig: sig.toCrock(), }; @@ -110,6 +112,35 @@ namespace RpcFunctions { } + export function createTipPlanchet(denom: DenominationRecord): TipPlanchet { + const denomPub = native.RsaPublicKey.fromCrock(denom.denomPub); + const coinPriv = native.EddsaPrivateKey.create(); + const coinPub = coinPriv.getPublicKey(); + const blindingFactor = native.RsaBlindingKeySecret.create(); + const pubHash: native.HashCode = coinPub.hash(); + const ev = native.rsaBlind(pubHash, blindingFactor, denomPub); + + if (!ev) { + throw Error("couldn't blind (malicious exchange key?)"); + } + + if (!denom.feeWithdraw) { + throw Error("Field fee_withdraw missing"); + } + + const tipPlanchet: TipPlanchet = { + blindingKey: blindingFactor.toCrock(), + coinEv: ev.toCrock(), + coinPriv: coinPriv.toCrock(), + coinPub: coinPub.toCrock(), + coinValue: denom.value, + denomPubHash: denomPub.encode().hash().toCrock(), + denomPub: denomPub.encode().toCrock(), + }; + return tipPlanchet; + } + + /** * Create and sign a message to request payback for a coin. */ |