wallet-core: towards exchange protocol v12
This commit is contained in:
parent
188ff0b453
commit
a7b89247e4
@ -1620,3 +1620,9 @@ export const codecForMerchantConfigResponse = (): Codec<MerchantConfigResponse>
|
||||
.property("name", codecForString())
|
||||
.property("version", codecForString())
|
||||
.build("MerchantConfigResponse");
|
||||
|
||||
|
||||
export enum ExchangeProtocolVersion {
|
||||
V9 = 9,
|
||||
V12 = 12,
|
||||
}
|
||||
|
@ -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(),
|
||||
],
|
||||
}
|
||||
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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),
|
||||
|
@ -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,
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user