summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/crypto
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2020-12-15 17:12:22 +0100
committerFlorian Dold <florian@dold.me>2020-12-15 17:12:22 +0100
commitc09c5bbe625566fc61c811160d2ccdab263327fa (patch)
tree4ce80e615bad8cf325b1b31aac957c6ce1ee0f05 /packages/taler-wallet-core/src/crypto
parentf332d61fb68fbc394f31337ddeb7d1fc114772d0 (diff)
downloadwallet-core-c09c5bbe625566fc61c811160d2ccdab263327fa.tar.gz
wallet-core-c09c5bbe625566fc61c811160d2ccdab263327fa.tar.bz2
wallet-core-c09c5bbe625566fc61c811160d2ccdab263327fa.zip
derive tipping planchets from seed, implement backup further
Diffstat (limited to 'packages/taler-wallet-core/src/crypto')
-rw-r--r--packages/taler-wallet-core/src/crypto/talerCrypto.ts19
-rw-r--r--packages/taler-wallet-core/src/crypto/workers/cryptoApi.ts17
-rw-r--r--packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts26
3 files changed, 34 insertions, 28 deletions
diff --git a/packages/taler-wallet-core/src/crypto/talerCrypto.ts b/packages/taler-wallet-core/src/crypto/talerCrypto.ts
index 4faa523a0..095957982 100644
--- a/packages/taler-wallet-core/src/crypto/talerCrypto.ts
+++ b/packages/taler-wallet-core/src/crypto/talerCrypto.ts
@@ -390,6 +390,25 @@ export function setupRefreshPlanchet(
};
}
+export function setupTipPlanchet(
+ secretSeed: Uint8Array,
+ coinNumber: number,
+): FreshCoin {
+ const info = stringToBytes("taler-tip-coin-derivation");
+ const saltArrBuf = new ArrayBuffer(4);
+ const salt = new Uint8Array(saltArrBuf);
+ const saltDataView = new DataView(saltArrBuf);
+ saltDataView.setUint32(0, coinNumber);
+ const out = kdf(64, secretSeed, salt, info);
+ const coinPriv = out.slice(0, 32);
+ const bks = out.slice(32, 64);
+ return {
+ bks,
+ coinPriv,
+ coinPub: eddsaGetPublic(coinPriv),
+ };
+}
+
export function setupRefreshTransferPub(
secretSeed: Uint8Array,
transferPubIndex: number,
diff --git a/packages/taler-wallet-core/src/crypto/workers/cryptoApi.ts b/packages/taler-wallet-core/src/crypto/workers/cryptoApi.ts
index 6a4264d2c..ef149823c 100644
--- a/packages/taler-wallet-core/src/crypto/workers/cryptoApi.ts
+++ b/packages/taler-wallet-core/src/crypto/workers/cryptoApi.ts
@@ -22,16 +22,7 @@
/**
* Imports.
*/
-import { AmountJson } from "../../util/amounts";
-
-import {
- CoinRecord,
- DenominationRecord,
- RefreshSessionRecord,
- TipPlanchet,
- WireFee,
- DenominationSelectionInfo,
-} from "../../types/dbTypes";
+import { CoinRecord, DenominationRecord, WireFee } from "../../types/dbTypes";
import { CryptoWorker } from "./cryptoWorker";
@@ -49,7 +40,9 @@ import * as timer from "../../util/timer";
import { Logger } from "../../util/logging";
import {
DerivedRefreshSession,
+ DerivedTipPlanchet,
DeriveRefreshSessionRequest,
+ DeriveTipRequest,
} from "../../types/cryptoTypes";
const logger = new Logger("cryptoApi.ts");
@@ -329,8 +322,8 @@ export class CryptoApi {
return this.doRpc<PlanchetCreationResult>("createPlanchet", 1, req);
}
- createTipPlanchet(denom: DenominationRecord): Promise<TipPlanchet> {
- return this.doRpc<TipPlanchet>("createTipPlanchet", 1, denom);
+ createTipPlanchet(req: DeriveTipRequest): Promise<DerivedTipPlanchet> {
+ return this.doRpc<DerivedTipPlanchet>("createTipPlanchet", 1, req);
}
hashString(str: string): Promise<string> {
diff --git a/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts b/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts
index d14f663e8..deaad42bb 100644
--- a/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts
+++ b/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts
@@ -30,11 +30,8 @@ import {
CoinRecord,
DenominationRecord,
RefreshPlanchet,
- RefreshSessionRecord,
- TipPlanchet,
WireFee,
CoinSourceType,
- DenominationSelectionInfo,
} from "../../types/dbTypes";
import { CoinDepositPermission, RecoupRequest } from "../../types/talerTypes";
@@ -59,25 +56,25 @@ import {
rsaUnblind,
stringToBytes,
createHashContext,
- createEcdheKeyPair,
keyExchangeEcdheEddsa,
setupRefreshPlanchet,
rsaVerify,
- getRandomBytes,
setupRefreshTransferPub,
+ setupTipPlanchet,
} from "../talerCrypto";
import { randomBytes } from "../primitives/nacl-fast";
import { kdf } from "../primitives/kdf";
import {
Timestamp,
- getTimestampNow,
timestampTruncateToSecond,
} from "../../util/time";
import { Logger } from "../../util/logging";
import {
DerivedRefreshSession,
+ DerivedTipPlanchet,
DeriveRefreshSessionRequest,
+ DeriveTipRequest,
} from "../../types/cryptoTypes";
const logger = new Logger("cryptoImplementation.ts");
@@ -199,21 +196,18 @@ export class CryptoImplementation {
/**
* Create a planchet used for tipping, including the private keys.
*/
- createTipPlanchet(denom: DenominationRecord): TipPlanchet {
- const denomPub = decodeCrock(denom.denomPub);
- const coinKeyPair = createEddsaKeyPair();
+ createTipPlanchet(req: DeriveTipRequest): DerivedTipPlanchet {
+ const fc = setupTipPlanchet(decodeCrock(req.secretSeed), req.planchetIndex);
+ const denomPub = decodeCrock(req.denomPub);
const blindingFactor = createBlindingKeySecret();
- const coinPubHash = hash(coinKeyPair.eddsaPub);
+ const coinPubHash = hash(fc.coinPub);
const ev = rsaBlind(coinPubHash, blindingFactor, denomPub);
- const tipPlanchet: TipPlanchet = {
+ const tipPlanchet: DerivedTipPlanchet = {
blindingKey: encodeCrock(blindingFactor),
coinEv: encodeCrock(ev),
- coinPriv: encodeCrock(coinKeyPair.eddsaPriv),
- coinPub: encodeCrock(coinKeyPair.eddsaPub),
- coinValue: denom.value,
- denomPub: encodeCrock(denomPub),
- denomPubHash: encodeCrock(hash(denomPub)),
+ coinPriv: encodeCrock(fc.coinPriv),
+ coinPub: encodeCrock(fc.coinPub),
};
return tipPlanchet;
}