wallet-core: towards exchange protocol v12

This commit is contained in:
Florian Dold 2022-01-05 20:29:55 +01:00
parent 188ff0b453
commit a7b89247e4
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
6 changed files with 86 additions and 21 deletions

View File

@ -1620,3 +1620,9 @@ export const codecForMerchantConfigResponse = (): Codec<MerchantConfigResponse>
.property("name", codecForString())
.property("version", codecForString())
.build("MerchantConfigResponse");
export enum ExchangeProtocolVersion {
V9 = 9,
V12 = 12,
}

View File

@ -4,7 +4,8 @@ import nodeResolve from "@rollup/plugin-node-resolve";
import json from "@rollup/plugin-json";
import builtins from "builtin-modules";
import pkg from "./package.json";
import sourcemaps from 'rollup-plugin-sourcemaps';
import sourcemaps from "rollup-plugin-sourcemaps";
import path from "path";
export default {
input: "lib/index.js",
@ -12,6 +13,15 @@ export default {
file: pkg.main,
format: "cjs",
sourcemap: true,
sourcemapPathTransform: (relativeSourcePath, sourcemapPath) => {
// Transform to source map paths to virtual path. Otherwise,
// error messages would contain paths that look like they should exist (relative to
// the bundle) but don't.
const res = path.normalize(
path.join("/_walletsrc/packages/taler-wallet-cli/src/", relativeSourcePath),
);
return res;
},
},
external: builtins,
plugins: [
@ -29,5 +39,4 @@ export default {
json(),
],
}
};

View File

@ -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;

View File

@ -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)
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),

View File

@ -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,7 +201,8 @@ async function refreshCreateSession(
}
// FIXME: use an index here, based on the withdrawal expiration time.
const availableDenoms: DenominationRecord[] = await tx.denominations.indexes.byExchangeBaseUrl
const availableDenoms: DenominationRecord[] =
await tx.denominations.indexes.byExchangeBaseUrl
.iter(exchange.baseUrl)
.toArray();
@ -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,

View File

@ -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.