summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2022-01-05 20:29:55 +0100
committerFlorian Dold <florian@dold.me>2022-01-05 20:29:55 +0100
commita7b89247e41c272027d9c90a13c9a76901019daa (patch)
tree229a80e2498ff0b2c788ac72a524012a9c9ae67a /packages/taler-wallet-core/src
parent188ff0b453631c21f39ec6027e19aa3d1e99c30a (diff)
downloadwallet-core-a7b89247e41c272027d9c90a13c9a76901019daa.tar.gz
wallet-core-a7b89247e41c272027d9c90a13c9a76901019daa.tar.bz2
wallet-core-a7b89247e41c272027d9c90a13c9a76901019daa.zip
wallet-core: towards exchange protocol v12
Diffstat (limited to 'packages/taler-wallet-core/src')
-rw-r--r--packages/taler-wallet-core/src/crypto/cryptoTypes.ts3
-rw-r--r--packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts37
-rw-r--r--packages/taler-wallet-core/src/operations/refresh.ts44
-rw-r--r--packages/taler-wallet-core/src/versions.ts2
4 files changed, 68 insertions, 18 deletions
diff --git a/packages/taler-wallet-core/src/crypto/cryptoTypes.ts b/packages/taler-wallet-core/src/crypto/cryptoTypes.ts
index 7d616ecb6..9b72dfbe2 100644
--- a/packages/taler-wallet-core/src/crypto/cryptoTypes.ts
+++ b/packages/taler-wallet-core/src/crypto/cryptoTypes.ts
@@ -27,7 +27,7 @@
/**
* Imports.
*/
-import { AmountJson, DenominationPubKey } from "@gnu-taler/taler-util";
+import { AmountJson, DenominationPubKey, ExchangeProtocolVersion } from "@gnu-taler/taler-util";
export interface RefreshNewDenomInfo {
count: number;
@@ -41,6 +41,7 @@ export interface RefreshNewDenomInfo {
* secret seed.
*/
export interface DeriveRefreshSessionRequest {
+ exchangeProtocolVersion: ExchangeProtocolVersion;
sessionSecretSeed: string;
kappa: number;
meltCoinPub: string;
diff --git a/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts b/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts
index b5987582a..9e2dc18f3 100644
--- a/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts
+++ b/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts
@@ -36,6 +36,7 @@ import {
buildSigPS,
CoinDepositPermission,
DenomKeyType,
+ ExchangeProtocolVersion,
FreshCoin,
hashDenomPub,
RecoupRequest,
@@ -162,7 +163,7 @@ async function myEddsaSign(
export class CryptoImplementation {
static enableTracing = false;
- constructor(private primitiveWorker?: PrimitiveWorker) { }
+ constructor(private primitiveWorker?: PrimitiveWorker) {}
/**
* Create a pre-coin of the given denomination to be withdrawn from then given
@@ -364,18 +365,18 @@ export class CryptoImplementation {
}
isValidWireAccount(
- versionCurrent: number,
+ versionCurrent: ExchangeProtocolVersion,
paytoUri: string,
sig: string,
masterPub: string,
): boolean {
- if (versionCurrent === 10 || versionCurrent === 11) {
+ if (versionCurrent === ExchangeProtocolVersion.V12) {
const paytoHash = hash(stringToBytes(paytoUri + "\0"));
const p = buildSigPS(TalerSignaturePurpose.MASTER_WIRE_DETAILS)
.put(paytoHash)
.build();
return eddsaVerify(p, decodeCrock(sig), decodeCrock(masterPub));
- } else if (versionCurrent === 9) {
+ } else if (versionCurrent === ExchangeProtocolVersion.V9) {
const h = kdf(
64,
stringToBytes("exchange-wire-signature"),
@@ -623,13 +624,27 @@ export class CryptoImplementation {
}
const sessionHash = sessionHc.finish();
- const confirmData = buildSigPS(TalerSignaturePurpose.WALLET_COIN_MELT)
- .put(sessionHash)
- .put(decodeCrock(meltCoinDenomPubHash))
- .put(amountToBuffer(valueWithFee))
- .put(amountToBuffer(meltFee))
- .put(decodeCrock(meltCoinPub))
- .build();
+ let confirmData: Uint8Array;
+ if (req.exchangeProtocolVersion === ExchangeProtocolVersion.V9) {
+ confirmData = buildSigPS(TalerSignaturePurpose.WALLET_COIN_MELT)
+ .put(sessionHash)
+ .put(decodeCrock(meltCoinDenomPubHash))
+ .put(amountToBuffer(valueWithFee))
+ .put(amountToBuffer(meltFee))
+ .put(decodeCrock(meltCoinPub))
+ .build();
+ } else if (req.exchangeProtocolVersion === ExchangeProtocolVersion.V12) {
+ confirmData = buildSigPS(TalerSignaturePurpose.WALLET_COIN_MELT)
+ .put(sessionHash)
+ .put(decodeCrock(meltCoinDenomPubHash))
+ .put(amountToBuffer(valueWithFee))
+ .put(amountToBuffer(meltFee))
+ .build();
+ } else {
+ throw Error(
+ `Exchange protocol version (${req.exchangeProtocolVersion}) not supported`,
+ );
+ }
const confirmSigResp = await myEddsaSign(this.primitiveWorker, {
msg: encodeCrock(confirmData),
diff --git a/packages/taler-wallet-core/src/operations/refresh.ts b/packages/taler-wallet-core/src/operations/refresh.ts
index 51eac4a64..00eaa0eac 100644
--- a/packages/taler-wallet-core/src/operations/refresh.ts
+++ b/packages/taler-wallet-core/src/operations/refresh.ts
@@ -17,6 +17,7 @@
import {
DenomKeyType,
encodeCrock,
+ ExchangeProtocolVersion,
getRandomBytes,
HttpStatusCode,
} from "@gnu-taler/taler-util";
@@ -91,8 +92,10 @@ export function getTotalRefreshCost(
refreshedDenom: DenominationRecord,
amountLeft: AmountJson,
): AmountJson {
- const withdrawAmount = Amounts.sub(amountLeft, refreshedDenom.feeRefresh)
- .amount;
+ const withdrawAmount = Amounts.sub(
+ amountLeft,
+ refreshedDenom.feeRefresh,
+ ).amount;
const withdrawDenoms = selectWithdrawalDenominations(withdrawAmount, denoms);
const resultingAmount = Amounts.add(
Amounts.getZero(withdrawAmount.currency),
@@ -198,9 +201,10 @@ async function refreshCreateSession(
}
// FIXME: use an index here, based on the withdrawal expiration time.
- const availableDenoms: DenominationRecord[] = await tx.denominations.indexes.byExchangeBaseUrl
- .iter(exchange.baseUrl)
- .toArray();
+ const availableDenoms: DenominationRecord[] =
+ await tx.denominations.indexes.byExchangeBaseUrl
+ .iter(exchange.baseUrl)
+ .toArray();
const availableAmount = Amounts.sub(
refreshGroup.inputPerCoin[coinIndex],
@@ -351,7 +355,22 @@ async function refreshMelt(
const { newCoinDenoms, oldCoin, oldDenom, refreshGroup, refreshSession } = d;
+ let exchangeProtocolVersion: ExchangeProtocolVersion;
+ switch (d.oldDenom.denomPub.cipher) {
+ case DenomKeyType.LegacyRsa: {
+ exchangeProtocolVersion = ExchangeProtocolVersion.V9;
+ break;
+ }
+ case DenomKeyType.Rsa: {
+ exchangeProtocolVersion = ExchangeProtocolVersion.V12;
+ break;
+ }
+ default:
+ throw Error("unsupported key type");
+ }
+
const derived = await ws.cryptoApi.deriveRefreshSession({
+ exchangeProtocolVersion,
kappa: 3,
meltCoinDenomPubHash: oldCoin.denomPubHash,
meltCoinPriv: oldCoin.coinPriv,
@@ -531,7 +550,22 @@ async function refreshReveal(
norevealIndex,
} = d;
+ let exchangeProtocolVersion: ExchangeProtocolVersion;
+ switch (d.oldDenom.denomPub.cipher) {
+ case DenomKeyType.LegacyRsa: {
+ exchangeProtocolVersion = ExchangeProtocolVersion.V9;
+ break;
+ }
+ case DenomKeyType.Rsa: {
+ exchangeProtocolVersion = ExchangeProtocolVersion.V12;
+ break;
+ }
+ default:
+ throw Error("unsupported key type");
+ }
+
const derived = await ws.cryptoApi.deriveRefreshSession({
+ exchangeProtocolVersion,
kappa: 3,
meltCoinDenomPubHash: oldCoin.denomPubHash,
meltCoinPriv: oldCoin.coinPriv,
diff --git a/packages/taler-wallet-core/src/versions.ts b/packages/taler-wallet-core/src/versions.ts
index 9ef298d62..23445b257 100644
--- a/packages/taler-wallet-core/src/versions.ts
+++ b/packages/taler-wallet-core/src/versions.ts
@@ -19,7 +19,7 @@
*
* Uses libtool's current:revision:age versioning.
*/
-export const WALLET_EXCHANGE_PROTOCOL_VERSION = "10:0:1";
+export const WALLET_EXCHANGE_PROTOCOL_VERSION = "12:0:0";
/**
* Protocol version spoken with the merchant.