diff options
Diffstat (limited to 'src/crypto/cryptoWorker.ts')
-rw-r--r-- | src/crypto/cryptoWorker.ts | 31 |
1 files changed, 31 insertions, 0 deletions
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. */ |