lsd0009

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

commit 082be14f80737a103fc0af8c8bb732ff328b7699
parent 813b7afbbcd10b0fb530f93cb04299ec656419e1
Author: Mikolai Gütschow <mikolai.guetschow@tu-dresden.de>
Date:   Thu,  2 Apr 2026 18:03:13 +0200

protocol: migrate deposit to Florian-suggested structure

Diffstat:
Mdraft-guetschow-taler-protocol.md | 111++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Mdraft-guetschow-taler-protocol.xml | 389++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
2 files changed, 297 insertions(+), 203 deletions(-)

diff --git a/draft-guetschow-taler-protocol.md b/draft-guetschow-taler-protocol.md @@ -432,6 +432,7 @@ knows denomᵢ.pub knows denomᵢ.priv +----------------------+ | | (W3) coin unblinding | | +----------------------+ | + | | ~~~ where (for RSA, without age-restriction) @@ -498,8 +499,8 @@ The payment is complete as soon as the merchant successfully redeems the deposit ~~~ wallet merchant -knows merchant.pub knows merchant.priv -knows valid coinᵢ knows exchange, payto +knows valid coinᵢ knows merchant.priv + knows exchange, payto | | | +-----------------------+ | | (M1) order generation | @@ -519,7 +520,7 @@ knows valid coinᵢ knows exchange, payto | | (M2) contract generation | | +--------------------------+ | | - |<---------- (contract, sig) ------------| + |<---- (contract, merchant.pub, contract_sig) ----| | | +--------------------------+ | | (W2) payment preparation | | @@ -537,6 +538,7 @@ knows valid coinᵢ knows exchange, payto +---------------------------+ | | (W3) payment verification | | +---------------------------+ | + | | ~~~ where (without age restriction, policy and wallet data hash) @@ -571,17 +573,20 @@ contract.nonce = nonce.pub persist contract h_contract = SHA-512(canonicalJSON(contract)) msg = Sign-Msg(MERCHANT_CONTRACT, h_contract) -sig = EdDSA-Sign(merchant.priv, msg) +contract_sig = EdDSA-Sign(merchant.priv, msg) ~~~ ~~~ (W2) payment preparation (wallet) -check EdDSA-Verify(merchant.pub, msg, sig) +h_contract = SHA-512(canonicalJSON(contract)) +msg = Sign-Msg(MERCHANT_CONTRACT, h_contract) +check EdDSA-Verify(merchant.pub, msg, contract_sig) check contract.nonce = nonce TODO: double-check extra hash check? ~selection = CoinSelection(contract.{exchange,price}) TODO: include MarkDirty here (coinᵢ, denomᵢ, contributionᵢ) = selectionᵢ +h_contract = SHA-512(canonicalJSON(contract)) msgᵢ = Sign-Msg(WALLET_COIN_DEPOSIT, ( h_contract | uint256(0x0) | uint512(0x0) | contract.h_wire | coinᵢ.h_denom @@ -595,12 +600,14 @@ persist (contract, ~sig, ~deposit) // TODO: explain CoinSelection // TODO: maybe better {sigᵢ} instead of ~sig? +// TODO: maybe introduce symbol for pub/priv +// TODO: maybe rename Sign-Msg as name is currently a bit confusing ~~~ (M3) deposit check (merchant) check sum(depositᵢ.contribution) == contract.price -check Deposit(deposit)ᵢ +check Deposit(~deposit) msg = Sign-Msg(MERCHANT_PAYMENT_OK, h_contract) sig = EdDSA-Sign(merchant.priv, msg) ~~~ @@ -608,50 +615,90 @@ sig = EdDSA-Sign(merchant.priv, msg) ~~~ (W3) payment verification (wallet) +msg = Sign-Msg(MERCHANT_PAYMENT_OK, h_contract) check EdDSA-Verify(merchant.pub, msg, sig) ~~~ ## Deposit {#deposit} +// todo: add introductory text + ~~~ merchant/wallet exchange knows exchange.pub knows exchange.priv -knows merchant.pub knows *denom.pub -knows payto, wire_salt, sig2, h_contract -knows contract, *deposit from Payment +knows contract_sig knows denomᵢ.pub +knows payto, wire_salt | +knows contract, ~deposit | + | | ++--------------------------+ | +| (M1) deposit preparation | | ++--------------------------+ | | | |----------- /batch-deposit ------------>| - | (contract.{timestamp,wire_deadline,refund_deadline} - | h_contract, merchant.pub, sig2, | - | payto, *deposit, wire_salt) | + | (info, h_contract, ~deposit | + | merchant.pub, contract_sig) | | | - | *denom = Denom-Lookup(*deposit.coin.h_denom) - | check *denom.pub known and not deposit-expired - | contract.h_wire = HKDF(wire_salt, payto, - | "merchant-wire-signature", 64) - | check *EdDSA-Verify(deposit.coin.pub, msg1, sig1) - | check *RSA-FDH-Verify(SHA-512(deposit.coin.pub), - | deposit.coin.sig, denom.pub) - | check not overspending - | persist deposit-record, mark-spent - | schedule bank transfer - | exchange_timestamp = now() - | sig3 = EdDSA-Sign(exchange.priv, msg3) + | +-------------------------+ + | | (E1) deposit validation | + | +-------------------------+ | | - |<----- sig3, exchange_timestamp --------| + |<--- (timestamp, exchange.pub, sig) ----| | | -check EdDSA-Verify(exchange.pub, msg3, sig3) | ++---------------------------+ | +| (M2) deposit verification | | ++---------------------------+ | + | | +~~~ + +where (without age restriction, policy and wallet data hash) + +~~~ +(M1) Deposit preparation (merchant/wallet) + +h_contract = SHA-512(canonicalJSON(contract)) +info.time = contract.{timestamp, wire_deadline, refund_deadline} +info.wire = (payto, wire_salt) +~~~ + ~~~ +(E1) Deposit validation (exchange) -where `msg3` is formed as follows: +coinᵢ = depositᵢ.coin +denomᵢ = Denom-Lookup(coinᵢ.h_denom) +check denomᵢ.pub known and not deposit-expired +h_wire = HKDF(info.wire.wire_salt, info.wire.payto, "merchant-wire-signature", 64) +msgᵢ = Sign-Msg(WALLET_COIN_DEPOSIT, + ( h_contract | uint256(0x0) + | uint512(0x0) | h_wire | coinᵢ.h_denom + | info.time.timestamp | info.time.refund_deadline + | depositᵢ.contribution + denomᵢ.fee_deposit + | denomᵢ.fee_deposit | merchant.pub | uint512(0x0) )) +check EdDSA-Verify(coinᵢ.pub, msgᵢ, depositᵢ.sig) +check RSA-FDH-Verify(SHA-512(coinᵢ.pub), coinᵢ.sig, denomᵢ.pub) +check not overspending +persist deposit-record, mark-spent +schedule bank transfer to payto +timestamp = now() +msg = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT, + ( h_contract | h_wire | uint512(0x0) + | timestamp | info.time.wire_deadline + | info.time.refund_deadline + | sum(depositᵢ.contribution) - sum(denomᵢ.fee_deposit) + | SHA-512(depositᵢ.sig) | merchant.pub )) +sig = EdDSA-Sign(exchange.priv, msg) +~~~ ~~~ -msg3 = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT, - ( h_contract | contract.h_wire | uint512(0x0) - | exchange_timestamp | contract.wire_deadline +(M2) Deposit verification (merchant/wallet) + +h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64) +msg = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT, + ( h_contract | h_wire | uint512(0x0) + | timestamp | contract.wire_deadline | contract.refund_deadline - | sum(*deposit.contribution - *denom.fee_deposit) - | SHA-512(*deposit.sig1) | merchant.pub )) + | sum(depositᵢ.contribution) - sum(denomᵢ.fee_deposit) + | SHA-512(depositᵢ.sig) | merchant.pub )) +check EdDSA-Verify(exchange.pub, msg, sig) ~~~ # Security Considerations diff --git a/draft-guetschow-taler-protocol.xml b/draft-guetschow-taler-protocol.xml @@ -420,6 +420,7 @@ knows denomᵢ.pub knows denomᵢ.priv +----------------------+ | | (W3) coin unblinding | | +----------------------+ | + | | ]]></artwork> <t>where (for RSA, without age-restriction)</t> <artwork><![CDATA[ @@ -479,8 +480,8 @@ where the sum of all contributions (<tt>contributionᵢ &lt;= denomᵢ.value</tt The payment is complete as soon as the merchant successfully redeems the deposit authorizations at the exchange (cf. <xref target="deposit"/>).</t> <artwork><![CDATA[ wallet merchant -knows merchant.pub knows merchant.priv -knows valid coinᵢ knows exchange, payto +knows valid coinᵢ knows merchant.priv + knows exchange, payto | | | +-----------------------+ | | (M1) order generation | @@ -500,7 +501,7 @@ knows valid coinᵢ knows exchange, payto | | (M2) contract generation | | +--------------------------+ | | - |<---------- (contract, sig) ------------| + |<---- (contract, merchant.pub, contract_sig) ----| | | +--------------------------+ | | (W2) payment preparation | | @@ -518,6 +519,7 @@ knows valid coinᵢ knows exchange, payto +---------------------------+ | | (W3) payment verification | | +---------------------------+ | + | | ]]></artwork> <t>where (without age restriction, policy and wallet data hash)</t> <artwork><![CDATA[ @@ -547,16 +549,19 @@ contract.nonce = nonce.pub persist contract h_contract = SHA-512(canonicalJSON(contract)) msg = Sign-Msg(MERCHANT_CONTRACT, h_contract) -sig = EdDSA-Sign(merchant.priv, msg) +contract_sig = EdDSA-Sign(merchant.priv, msg) ]]></artwork> <artwork><![CDATA[ (W2) payment preparation (wallet) -check EdDSA-Verify(merchant.pub, msg, sig) +h_contract = SHA-512(canonicalJSON(contract)) +msg = Sign-Msg(MERCHANT_CONTRACT, h_contract) +check EdDSA-Verify(merchant.pub, msg, contract_sig) check contract.nonce = nonce TODO: double-check extra hash check? ~selection = CoinSelection(contract.{exchange,price}) TODO: include MarkDirty here (coinᵢ, denomᵢ, contributionᵢ) = selectionᵢ +h_contract = SHA-512(canonicalJSON(contract)) msgᵢ = Sign-Msg(WALLET_COIN_DEPOSIT, ( h_contract | uint256(0x0) | uint512(0x0) | contract.h_wire | coinᵢ.h_denom @@ -568,60 +573,99 @@ depositᵢ = (coinᵢ.{pub,sig,h_denom}, contributionᵢ, sigᵢ) persist (contract, ~sig, ~deposit) ]]></artwork> <t>// TODO: explain CoinSelection -// TODO: maybe better {sigᵢ} instead of ~sig?</t> +// TODO: maybe better {sigᵢ} instead of ~sig? +// TODO: maybe introduce symbol for pub/priv +// TODO: maybe rename Sign-Msg as name is currently a bit confusing</t> <artwork><![CDATA[ (M3) deposit check (merchant) check sum(depositᵢ.contribution) == contract.price -check Deposit(deposit)ᵢ +check Deposit(~deposit) msg = Sign-Msg(MERCHANT_PAYMENT_OK, h_contract) sig = EdDSA-Sign(merchant.priv, msg) ]]></artwork> <artwork><![CDATA[ (W3) payment verification (wallet) +msg = Sign-Msg(MERCHANT_PAYMENT_OK, h_contract) check EdDSA-Verify(merchant.pub, msg, sig) ]]></artwork> </section> <section anchor="deposit"> <name>Deposit</name> + <t>// todo: add introductory text</t> <artwork><![CDATA[ merchant/wallet exchange knows exchange.pub knows exchange.priv -knows merchant.pub knows *denom.pub -knows payto, wire_salt, sig2, h_contract -knows contract, *deposit from Payment +knows contract_sig knows denomᵢ.pub +knows payto, wire_salt | +knows contract, ~deposit | + | | ++--------------------------+ | +| (M1) deposit preparation | | ++--------------------------+ | | | |----------- /batch-deposit ------------>| - | (contract.{timestamp,wire_deadline,refund_deadline} - | h_contract, merchant.pub, sig2, | - | payto, *deposit, wire_salt) | + | (info, h_contract, ~deposit | + | merchant.pub, contract_sig) | | | - | *denom = Denom-Lookup(*deposit.coin.h_denom) - | check *denom.pub known and not deposit-expired - | contract.h_wire = HKDF(wire_salt, payto, - | "merchant-wire-signature", 64) - | check *EdDSA-Verify(deposit.coin.pub, msg1, sig1) - | check *RSA-FDH-Verify(SHA-512(deposit.coin.pub), - | deposit.coin.sig, denom.pub) - | check not overspending - | persist deposit-record, mark-spent - | schedule bank transfer - | exchange_timestamp = now() - | sig3 = EdDSA-Sign(exchange.priv, msg3) + | +-------------------------+ + | | (E1) deposit validation | + | +-------------------------+ | | - |<----- sig3, exchange_timestamp --------| + |<--- (timestamp, exchange.pub, sig) ----| + | | ++---------------------------+ | +| (M2) deposit verification | | ++---------------------------+ | | | -check EdDSA-Verify(exchange.pub, msg3, sig3) | ]]></artwork> - <t>where <tt>msg3</tt> is formed as follows:</t> + <t>where (without age restriction, policy and wallet data hash)</t> <artwork><![CDATA[ -msg3 = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT, - ( h_contract | contract.h_wire | uint512(0x0) - | exchange_timestamp | contract.wire_deadline +(M1) Deposit preparation (merchant/wallet) + +h_contract = SHA-512(canonicalJSON(contract)) +info.time = contract.{timestamp, wire_deadline, refund_deadline} +info.wire = (payto, wire_salt) +]]></artwork> + <artwork><![CDATA[ +(E1) Deposit validation (exchange) + +coinᵢ = depositᵢ.coin +denomᵢ = Denom-Lookup(coinᵢ.h_denom) +check denomᵢ.pub known and not deposit-expired +h_wire = HKDF(info.wire.wire_salt, info.wire.payto, "merchant-wire-signature", 64) +msgᵢ = Sign-Msg(WALLET_COIN_DEPOSIT, + ( h_contract | uint256(0x0) + | uint512(0x0) | h_wire | coinᵢ.h_denom + | info.time.timestamp | info.time.refund_deadline + | depositᵢ.contribution + denomᵢ.fee_deposit + | denomᵢ.fee_deposit | merchant.pub | uint512(0x0) )) +check EdDSA-Verify(coinᵢ.pub, msgᵢ, depositᵢ.sig) +check RSA-FDH-Verify(SHA-512(coinᵢ.pub), coinᵢ.sig, denomᵢ.pub) +check not overspending +persist deposit-record, mark-spent +schedule bank transfer to payto +timestamp = now() +msg = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT, + ( h_contract | h_wire | uint512(0x0) + | timestamp | info.time.wire_deadline + | info.time.refund_deadline + | sum(depositᵢ.contribution) - sum(denomᵢ.fee_deposit) + | SHA-512(depositᵢ.sig) | merchant.pub )) +sig = EdDSA-Sign(exchange.priv, msg) +]]></artwork> + <artwork><![CDATA[ +(M2) Deposit verification (merchant/wallet) + +h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64) +msg = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT, + ( h_contract | h_wire | uint512(0x0) + | timestamp | contract.wire_deadline | contract.refund_deadline - | sum(*deposit.contribution - *denom.fee_deposit) - | SHA-512(*deposit.sig1) | merchant.pub )) + | sum(depositᵢ.contribution) - sum(denomᵢ.fee_deposit) + | SHA-512(depositᵢ.sig) | merchant.pub )) +check EdDSA-Verify(exchange.pub, msg, sig) ]]></artwork> </section> </section> @@ -712,7 +756,7 @@ msg3 = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT, <refcontent>National Institute of Standards and Technology (U.S.)</refcontent> </reference> </references> - <?line 665?> + <?line 712?> <section anchor="change-log"> <name>Change log</name> @@ -725,143 +769,146 @@ Education and Research (BMBF) within the project Concrete Contracts.</t> </section> </back> <!-- ##markdown-source: -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 -5/8PNW0ZaAJSAAA= +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 +AA== -->