lsd0009

LSD0009: The GNU Taler Protocol
Log | Files | Refs | README

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:
Mdraft-guetschow-taler-protocol.md | 36+++++++++++++++++++++++-------------
Mdraft-guetschow-taler-protocol.xml | 407+++++++++++++++++++++++++++++++++++++++++--------------------------------------
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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 -->