commit 72316d7ba9f2fa83f922727971016e89323cb160
parent 33d92c34112ba39b607eec6f91bf09fe9bffbc44
Author: Mikolai Gütschow <mikolai.guetschow@tu-dresden.de>
Date: Wed, 8 Apr 2026 10:26:09 +0200
protocol: rename kappa and master_secret
Diffstat:
2 files changed, 232 insertions(+), 211 deletions(-)
diff --git a/draft-guetschow-taler-protocol.md b/draft-guetschow-taler-protocol.md
@@ -387,6 +387,15 @@ Output:
out = uint32(len(msg)) | uint32(purpose) | msg
~~~
+## Helper Functions
+
+~~~
+- Denom-Hash: SHA-512(uint32(0) | uint32(1) | denomᵢ.pub)
+- Planchet-Hash: SHA-512( SHA-512( denomᵢ.pub ) | uint32(0x1) | planchetᵢ )
+- check-decrement: check reserve.balance >= total, persist reserve.balance -= total
+- refresh-derivation (only for refresh/link)
+~~~
+
# The Taler Crypto Protocol
// todo: explain persist, check, knows, sum, indexing/list notation
@@ -447,9 +456,9 @@ reserve = EdDSA-Keygen()
persist (reserve, value)
~~~
-The wallet derives coins and blinding secrets using a HKDF from a single master secret per withdrawal operation,
+The wallet derives coins and blinding secrets using a HKDF from a single seed per withdrawal operation,
together with an integer index.
-This is strictly speaking an implementation detail since the master secret is never revealed to any other party,
+This is strictly speaking an implementation detail since the seed is never revealed to any other party,
and might be chosen to be implemented differently.
// todo: blind_secret/coin.priv differently generated in TALER_EXCHANGE_post_withdraw_start/prepare_coins, double check with wallet-core (probably implementation detail here)
@@ -457,10 +466,10 @@ and might be chosen to be implemented differently.
~~~
(W2) coin generation and blinding (wallet)
-master_secret = random(256)
-persist master_secret
+batch_seed = random(256)
+persist batch_seed
for i in 0..n:
- coin_seedᵢ = HKDF(uint32(i), master_secret, "taler-withdrawal-coin-derivation", 64)
+ coin_seedᵢ = HKDF(uint32(i), batch_seed, "taler-withdrawal-coin-derivation", 64)
blind_secretᵢ = coin_seedᵢ[32:]
coinᵢ.priv = coin_seedᵢ[:32]
coinᵢ.pub = EdDSA-GetPub(coinᵢ.priv)
@@ -502,7 +511,8 @@ for i in 0..n:
coinᵢ.sig = RSA-FDH-Unblind(blind_sigᵢ, blind_secretᵢ, denomᵢ.pub)
check RSA-FDH-Verify(SHA-512(coinᵢ.pub), coinᵢ.sig, denomᵢ.pub)
coinᵢ.h_denom = h_denomᵢ
- persist (coinᵢ, blind_secretᵢ) // todo: why blind_secret, if master_secret already persisted?
+ coinᵢ.blind_secret = blind_secretᵢ // todo: why save blind_secret, if batch_seed already persisted?
+persist ⟨coinᵢ⟩
~~~
## Payment {#payment}
@@ -790,7 +800,7 @@ commitment // see TALER_refresh_get_commitment
refresh_seed = random(256)
⟨batch_seedₖ⟩ = HKDF("refresh-batch-seeds", refresh_seed, coin.priv, k*64)
-for k in 0..kappa:
+for k in 0..κ:
⟨transferₖᵢ.priv⟩ = HKDF("refresh-transfer-private-keys", batch_seedₖ, "", n*32)
for i in 0..n:
transferₖᵢ.pub = EdDSA-GetPub(transferₖᵢ.priv)
@@ -837,7 +847,7 @@ value' = coin.denom.fee_refresh + sum( ⟨denomᵢ.value⟩ ) + sum( ⟨denomᵢ
check value' == value
check coin.value >= value
persist coin.value -= value
-for k in 0..kappa:
+for k in 0..κ:
for i in 0..n:
h_planchetₖᵢ = SHA-512( SHA-512( denomᵢ.pub ) | uint32(0x1) | planchetₖᵢ )
h_planchetsₖ = SHA-512( ⟨h_planchetₖᵢ⟩ )
@@ -849,7 +859,7 @@ msg = Sign-Msg(WALLET_COIN_MELT,
check EdDSA-Verify(coin.pub, msg, sig)
(ɣ, _, _, done, _) = lookup refresh-record(commitment)
if refresh-record not found:
- ɣ = 0..kappa at random
+ ɣ = 0..κ at random
for i in 0..n:
blind_sigᵢ = RSA-FDH-Sign(planchetᵧᵢ, denomᵧᵢ.priv)
link_info = (refresh_seed, ⟨transferₖᵢ.pub⟩, ⟨h_denomᵢ⟩, coin_sig)
@@ -875,7 +885,7 @@ msg = Sign-Msg(EXCHANGE_CONFIRM_MELT,
( commitment | ɣ ))
check EdDSA-Verify(exchange.pub, msg, sig)
persist refresh-challenge // what exactly?
-for k in 0..kappa and k != ɣ:
+for k in 0..κ and k != ɣ:
revealed_seedₖ = batch_seedₖ
~~~
@@ -891,7 +901,7 @@ for k in 0..kappa and k != ɣ:
(ɣ, ⟨blind_sigᵢ⟩, h_planchetsᵧ, done, _) = lookup refresh-record(commitment)
check not done // todo: sure?
-for k in 0..kappa and k != ɣ:
+for k in 0..κ and k != ɣ:
⟨transferₖᵢ.priv⟩ = HKDF("refresh-transfer-private-keys", batch_seedₖ, "", n*32)
for i in 0..n:
transferₖᵢ.pub = EdDSA-GetPub(transferₖᵢ.priv)
@@ -997,7 +1007,7 @@ else:
for i in 0..n:
denomᵢ = Denom-Lookup(h_denomᵢ)
-for k in 0..kappa:
+for k in 0..κ:
for i in 0..n:
sharedₖᵢ = ECDH-EdDSA(coin.priv, transferₖᵢ.pub)
planchet_seedₖᵢ = HKDF(uint32(i), sharedₖᵢ, "taler-coin-derivation", 64)
@@ -1020,7 +1030,7 @@ if ⟨blind_sigᵢ⟩ returned:
coinᵧᵢ.sig = RSA-FDH-Unblind(blind_sigᵧᵢ, blind_secretᵧᵢ, denomᵢ.pub)
check RSA-FDH-Verify(SHA-512(coinᵧᵢ.pub), coinᵧᵢ.sig, denomᵢ.pub)
coinᵧᵢ.h_denom = h_denomᵢ
- persist ⟨coinᵧᵢ⟩
+ persist ⟨coinᵧᵢ⟩
~~~
## Refund {#refund}
diff --git a/draft-guetschow-taler-protocol.xml b/draft-guetschow-taler-protocol.xml
@@ -24,7 +24,7 @@
<email>mikolai.guetschow@tu-dresden.de</email>
</address>
</author>
- <date year="2026" month="April" day="07"/>
+ <date year="2026" month="April" day="08"/>
<workgroup>independent</workgroup>
<keyword>taler</keyword>
<keyword>cryptography</keyword>
@@ -377,6 +377,15 @@ Output:
out = uint32(len(msg)) | uint32(purpose) | msg
]]></artwork>
</section>
+ <section anchor="helper-functions">
+ <name>Helper Functions</name>
+ <artwork><![CDATA[
+- Denom-Hash: SHA-512(uint32(0) | uint32(1) | denomᵢ.pub)
+- Planchet-Hash: SHA-512( SHA-512( denomᵢ.pub ) | uint32(0x1) | planchetᵢ )
+- check-decrement: check reserve.balance >= total, persist reserve.balance -= total
+- refresh-derivation (only for refresh/link)
+]]></artwork>
+ </section>
</section>
<section anchor="the-taler-crypto-protocol">
<name>The Taler Crypto Protocol</name>
@@ -430,18 +439,18 @@ knows ⟨denomᵢ⟩ knows ⟨denomᵢ.priv⟩
reserve = EdDSA-Keygen()
persist (reserve, value)
]]></artwork>
- <t>The wallet derives coins and blinding secrets using a HKDF from a single master secret per withdrawal operation,
+ <t>The wallet derives coins and blinding secrets using a HKDF from a single seed per withdrawal operation,
together with an integer index.
-This is strictly speaking an implementation detail since the master secret is never revealed to any other party,
+This is strictly speaking an implementation detail since the seed is never revealed to any other party,
and might be chosen to be implemented differently.</t>
<t>// todo: blind_secret/coin.priv differently generated in TALER_EXCHANGE_post_withdraw_start/prepare_coins, double check with wallet-core (probably implementation detail here)</t>
<artwork><![CDATA[
(W2) coin generation and blinding (wallet)
-master_secret = random(256)
-persist master_secret
+batch_seed = random(256)
+persist batch_seed
for i in 0..n:
- coin_seedᵢ = HKDF(uint32(i), master_secret, "taler-withdrawal-coin-derivation", 64)
+ coin_seedᵢ = HKDF(uint32(i), batch_seed, "taler-withdrawal-coin-derivation", 64)
blind_secretᵢ = coin_seedᵢ[32:]
coinᵢ.priv = coin_seedᵢ[:32]
coinᵢ.pub = EdDSA-GetPub(coinᵢ.priv)
@@ -481,7 +490,8 @@ for i in 0..n:
coinᵢ.sig = RSA-FDH-Unblind(blind_sigᵢ, blind_secretᵢ, denomᵢ.pub)
check RSA-FDH-Verify(SHA-512(coinᵢ.pub), coinᵢ.sig, denomᵢ.pub)
coinᵢ.h_denom = h_denomᵢ
- persist (coinᵢ, blind_secretᵢ) // todo: why blind_secret, if master_secret already persisted?
+ coinᵢ.blind_secret = blind_secretᵢ // todo: why save blind_secret, if batch_seed already persisted?
+persist ⟨coinᵢ⟩
]]></artwork>
</section>
<section anchor="payment">
@@ -735,7 +745,7 @@ knows coin |
refresh_seed = random(256)
⟨batch_seedₖ⟩ = HKDF("refresh-batch-seeds", refresh_seed, coin.priv, k*64)
-for k in 0..kappa:
+for k in 0..κ:
⟨transferₖᵢ.priv⟩ = HKDF("refresh-transfer-private-keys", batch_seedₖ, "", n*32)
for i in 0..n:
transferₖᵢ.pub = EdDSA-GetPub(transferₖᵢ.priv)
@@ -774,7 +784,7 @@ value' = coin.denom.fee_refresh + sum( ⟨denomᵢ.value⟩ ) + sum( ⟨denomᵢ
check value' == value
check coin.value >= value
persist coin.value -= value
-for k in 0..kappa:
+for k in 0..κ:
for i in 0..n:
h_planchetₖᵢ = SHA-512( SHA-512( denomᵢ.pub ) | uint32(0x1) | planchetₖᵢ )
h_planchetsₖ = SHA-512( ⟨h_planchetₖᵢ⟩ )
@@ -786,7 +796,7 @@ msg = Sign-Msg(WALLET_COIN_MELT,
check EdDSA-Verify(coin.pub, msg, sig)
(ɣ, _, _, done, _) = lookup refresh-record(commitment)
if refresh-record not found:
- ɣ = 0..kappa at random
+ ɣ = 0..κ at random
for i in 0..n:
blind_sigᵢ = RSA-FDH-Sign(planchetᵧᵢ, denomᵧᵢ.priv)
link_info = (refresh_seed, ⟨transferₖᵢ.pub⟩, ⟨h_denomᵢ⟩, coin_sig)
@@ -803,7 +813,7 @@ msg = Sign-Msg(EXCHANGE_CONFIRM_MELT,
( commitment | ɣ ))
check EdDSA-Verify(exchange.pub, msg, sig)
persist refresh-challenge // what exactly?
-for k in 0..kappa and k != ɣ:
+for k in 0..κ and k != ɣ:
revealed_seedₖ = batch_seedₖ
]]></artwork>
<artwork><![CDATA[
@@ -811,7 +821,7 @@ for k in 0..kappa and k != ɣ:
(ɣ, ⟨blind_sigᵢ⟩, h_planchetsᵧ, done, _) = lookup refresh-record(commitment)
check not done // todo: sure?
-for k in 0..kappa and k != ɣ:
+for k in 0..κ and k != ɣ:
⟨transferₖᵢ.priv⟩ = HKDF("refresh-transfer-private-keys", batch_seedₖ, "", n*32)
for i in 0..n:
transferₖᵢ.pub = EdDSA-GetPub(transferₖᵢ.priv)
@@ -887,7 +897,7 @@ else:
for i in 0..n:
denomᵢ = Denom-Lookup(h_denomᵢ)
-for k in 0..kappa:
+for k in 0..κ:
for i in 0..n:
sharedₖᵢ = ECDH-EdDSA(coin.priv, transferₖᵢ.pub)
planchet_seedₖᵢ = HKDF(uint32(i), sharedₖᵢ, "taler-coin-derivation", 64)
@@ -910,7 +920,7 @@ if ⟨blind_sigᵢ⟩ returned:
coinᵧᵢ.sig = RSA-FDH-Unblind(blind_sigᵧᵢ, blind_secretᵧᵢ, denomᵢ.pub)
check RSA-FDH-Verify(SHA-512(coinᵧᵢ.pub), coinᵧᵢ.sig, denomᵢ.pub)
coinᵧᵢ.h_denom = h_denomᵢ
- persist ⟨coinᵧᵢ⟩
+ persist ⟨coinᵧᵢ⟩
]]></artwork>
</section>
</section>
@@ -1018,7 +1028,7 @@ if ⟨blind_sigᵢ⟩ returned:
<refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
</reference>
</references>
- <?line 1050?>
+ <?line 1060?>
<section anchor="change-log">
<name>Change log</name>
@@ -1031,189 +1041,190 @@ Education and Research (BMBF) within the project Concrete Contracts.</t>
</section>
</back>
<!-- ##markdown-source:
-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
-ZXA36YkAAA==
+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
-->