summaryrefslogtreecommitdiff
path: root/src/crypto
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2019-12-19 20:42:49 +0100
committerFlorian Dold <florian.dold@gmail.com>2019-12-19 20:42:49 +0100
commit0c9358c1b2bd80e25940022e86bd8daef8184ad7 (patch)
treea8c8ca0134bd886d8151633aff4c85e9513ad32c /src/crypto
parent49e3b3e5b9bbf1ce356ef68f301d50c689ceecb9 (diff)
downloadwallet-core-0c9358c1b2bd80e25940022e86bd8daef8184ad7.tar.gz
wallet-core-0c9358c1b2bd80e25940022e86bd8daef8184ad7.tar.bz2
wallet-core-0c9358c1b2bd80e25940022e86bd8daef8184ad7.zip
new date format, replace checkable annotations with codecs
Diffstat (limited to 'src/crypto')
-rw-r--r--src/crypto/workers/cryptoApi.ts7
-rw-r--r--src/crypto/workers/cryptoImplementation.ts36
2 files changed, 16 insertions, 27 deletions
diff --git a/src/crypto/workers/cryptoApi.ts b/src/crypto/workers/cryptoApi.ts
index da807cce0..1c54d286a 100644
--- a/src/crypto/workers/cryptoApi.ts
+++ b/src/crypto/workers/cryptoApi.ts
@@ -30,6 +30,7 @@ import {
RefreshSessionRecord,
TipPlanchet,
WireFee,
+ WalletContractData,
} from "../../types/dbTypes";
import { CryptoWorker } from "./cryptoWorker";
@@ -384,14 +385,16 @@ export class CryptoApi {
}
signDeposit(
- contractTerms: ContractTerms,
+ contractTermsRaw: string,
+ contractData: WalletContractData,
cds: CoinWithDenom[],
totalAmount: AmountJson,
): Promise<PaySigInfo> {
return this.doRpc<PaySigInfo>(
"signDeposit",
3,
- contractTerms,
+ contractTermsRaw,
+ contractData,
cds,
totalAmount,
);
diff --git a/src/crypto/workers/cryptoImplementation.ts b/src/crypto/workers/cryptoImplementation.ts
index d745f497c..043711864 100644
--- a/src/crypto/workers/cryptoImplementation.ts
+++ b/src/crypto/workers/cryptoImplementation.ts
@@ -33,6 +33,7 @@ import {
TipPlanchet,
WireFee,
initRetryInfo,
+ WalletContractData,
} from "../../types/dbTypes";
import { CoinPaySig, ContractTerms, PaybackRequest } from "../../types/talerTypes";
@@ -40,13 +41,11 @@ import {
BenchmarkResult,
CoinWithDenom,
PaySigInfo,
- Timestamp,
PlanchetCreationResult,
PlanchetCreationRequest,
- getTimestampNow,
CoinPayInfo,
} from "../../types/walletTypes";
-import { canonicalJson, getTalerStampSec } from "../../util/helpers";
+import { canonicalJson } from "../../util/helpers";
import { AmountJson } from "../../util/amounts";
import * as Amounts from "../../util/amounts";
import * as timer from "../../util/timer";
@@ -70,6 +69,7 @@ import {
} from "../talerCrypto";
import { randomBytes } from "../primitives/nacl-fast";
import { kdf } from "../primitives/kdf";
+import { Timestamp, getTimestampNow } from "../../util/time";
enum SignaturePurpose {
RESERVE_WITHDRAW = 1200,
@@ -104,20 +104,6 @@ function timestampToBuffer(ts: Timestamp): Uint8Array {
v.setBigUint64(0, s);
return new Uint8Array(b);
}
-
-function talerTimestampStringToBuffer(ts: string): Uint8Array {
- const t_sec = getTalerStampSec(ts);
- if (t_sec === null || t_sec === undefined) {
- // Should have been validated before!
- throw Error("invalid timestamp");
- }
- const buffer = new ArrayBuffer(8);
- const dvbuf = new DataView(buffer);
- const s = BigInt(t_sec) * BigInt(1000 * 1000);
- dvbuf.setBigUint64(0, s);
- return new Uint8Array(buffer);
-}
-
class SignaturePurposeBuilder {
private chunks: Uint8Array[] = [];
@@ -346,7 +332,8 @@ export class CryptoImplementation {
* and deposit permissions for each given coin.
*/
signDeposit(
- contractTerms: ContractTerms,
+ contractTermsRaw: string,
+ contractData: WalletContractData,
cds: CoinWithDenom[],
totalAmount: AmountJson,
): PaySigInfo {
@@ -354,14 +341,13 @@ export class CryptoImplementation {
coinInfo: [],
};
- const contractTermsHash = this.hashString(canonicalJson(contractTerms));
+ const contractTermsHash = this.hashString(canonicalJson(JSON.parse(contractTermsRaw)));
const feeList: AmountJson[] = cds.map(x => x.denom.feeDeposit);
let fees = Amounts.add(Amounts.getZero(feeList[0].currency), ...feeList)
.amount;
// okay if saturates
- fees = Amounts.sub(fees, Amounts.parseOrThrow(contractTerms.max_fee))
- .amount;
+ fees = Amounts.sub(fees, contractData.maxDepositFee).amount;
const total = Amounts.add(fees, totalAmount).amount;
let amountSpent = Amounts.getZero(cds[0].coin.currentAmount.currency);
@@ -395,12 +381,12 @@ export class CryptoImplementation {
const d = buildSigPS(SignaturePurpose.WALLET_COIN_DEPOSIT)
.put(decodeCrock(contractTermsHash))
- .put(decodeCrock(contractTerms.H_wire))
- .put(talerTimestampStringToBuffer(contractTerms.timestamp))
- .put(talerTimestampStringToBuffer(contractTerms.refund_deadline))
+ .put(decodeCrock(contractData.wireInfoHash))
+ .put(timestampToBuffer(contractData.timestamp))
+ .put(timestampToBuffer(contractData.refundDeadline))
.put(amountToBuffer(coinSpend))
.put(amountToBuffer(cd.denom.feeDeposit))
- .put(decodeCrock(contractTerms.merchant_pub))
+ .put(decodeCrock(contractData.merchantPub))
.put(decodeCrock(cd.coin.coinPub))
.build();
const coinSig = eddsaSign(d, decodeCrock(cd.coin.coinPriv));