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:
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ᵢ <= 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==
-->