aboutsummaryrefslogtreecommitdiff
path: root/lib/wallet/cryptoLib.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/wallet/cryptoLib.ts')
-rw-r--r--lib/wallet/cryptoLib.ts92
1 files changed, 89 insertions, 3 deletions
diff --git a/lib/wallet/cryptoLib.ts b/lib/wallet/cryptoLib.ts
index 9a77b3d74..7969682b4 100644
--- a/lib/wallet/cryptoLib.ts
+++ b/lib/wallet/cryptoLib.ts
@@ -22,13 +22,21 @@
"use strict";
import * as native from "./emscriptif";
-import {PreCoin, Reserve, PayCoinInfo} from "./types";
+import {
+ PreCoin, PayCoinInfo, AmountJson,
+ RefreshSession, RefreshPreCoin, ReserveRecord
+} from "./types";
import create = chrome.alarms.create;
import {Offer} from "./wallet";
import {CoinWithDenom} from "./wallet";
import {CoinPaySig} from "./types";
import {Denomination} from "./types";
import {Amount} from "./emscriptif";
+import {Coin} from "../../background/lib/wallet/types";
+import {HashContext} from "./emscriptif";
+import {RefreshMeltCoinAffirmationPS} from "./emscriptif";
+import {EddsaPublicKey} from "./emscriptif";
+import {HashCode} from "./emscriptif";
export function main(worker: Worker) {
@@ -61,7 +69,7 @@ namespace RpcFunctions {
* reserve.
*/
export function createPreCoin(denom: Denomination,
- reserve: Reserve): PreCoin {
+ reserve: ReserveRecord): PreCoin {
let reservePriv = new native.EddsaPrivateKey();
reservePriv.loadCrock(reserve.reserve_priv);
let reservePub = new native.EddsaPublicKey();
@@ -224,4 +232,82 @@ namespace RpcFunctions {
}
return ret;
}
-}
+
+
+ function createWithdrawSession(kappa: number, meltCoin: Coin,
+ newCoinDenoms: Denomination[],
+ meltAmount: AmountJson,
+ meltFee: AmountJson): RefreshSession {
+
+ let sessionHc = new HashContext();
+
+ let transferPubs: string[] = [];
+
+ let preCoinsForGammas: RefreshPreCoin[][] = [];
+
+ for (let i = 0; i < newCoinDenoms.length; i++) {
+ let t = native.EcdsaPrivateKey.create();
+ sessionHc.read(t);
+ transferPubs.push(t.toCrock());
+ }
+
+ for (let i = 0; i < newCoinDenoms.length; i++) {
+ let r = native.RsaPublicKey.fromCrock(newCoinDenoms[i].denom_pub);
+ sessionHc.read(r.encode());
+ }
+
+ sessionHc.read(native.RsaPublicKey.fromCrock(meltCoin.coinPub).encode());
+ sessionHc.read((new native.Amount(meltAmount)).toNbo());
+
+ for (let j = 0; j < kappa; j++) {
+ let preCoins: RefreshPreCoin[] = [];
+ for (let i = 0; i < newCoinDenoms.length; i++) {
+
+ let coinPriv = native.EddsaPrivateKey.create();
+ let coinPub = coinPriv.getPublicKey();
+ let blindingFactor = native.RsaBlindingKeySecret.create();
+ let pubHash: native.HashCode = coinPub.hash();
+ let denomPub = native.RsaPublicKey.fromCrock(newCoinDenoms[i].denom_pub);
+ let ev: native.ByteArray = native.rsaBlind(pubHash,
+ blindingFactor,
+ denomPub);
+ let preCoin: RefreshPreCoin = {
+ blindingKey: blindingFactor.toCrock(),
+ coinEv: ev.toCrock(),
+ publicKey: coinPub.toCrock(),
+ privateKey: coinPriv.toCrock(),
+ };
+ preCoins.push(preCoin);
+ sessionHc.read(ev);
+ }
+ preCoinsForGammas.push(preCoins);
+ }
+
+ let sessionHash = new HashCode();
+ sessionHash.alloc();
+ sessionHc.finish(sessionHash);
+
+ let confirmData = new RefreshMeltCoinAffirmationPS({
+ coin_pub: EddsaPublicKey.fromCrock(meltCoin.coinPub),
+ amount_with_fee: (new Amount(meltAmount)).toNbo(),
+ session_hash: sessionHash,
+ melt_fee: (new Amount(meltFee)).toNbo()
+ });
+
+ let confirmSig: string = native.eddsaSign(confirmData.toPurpose(),
+ native.EddsaPrivateKey.fromCrock(
+ meltCoin.coinPriv)).toCrock();
+
+ let refreshSession: RefreshSession = {
+ meltCoinPub: meltCoin.coinPub,
+ newDenoms: newCoinDenoms.map((d) => d.denom_pub),
+ confirmSig,
+ valueWithFee: meltAmount,
+ transferPubs,
+ preCoinsForGammas,
+ };
+
+ return refreshSession;
+ }
+
+} \ No newline at end of file