commit 624a15a981cd3e1fd956a1cd3ac692aebab50346
parent 082be14f80737a103fc0af8c8bb732ff328b7699
Author: Mikolai Gütschow <mikolai.guetschow@tu-dresden.de>
Date: Thu, 2 Apr 2026 18:09:03 +0200
protocol: move datatypes out to own section, prepare future sections
Diffstat:
2 files changed, 209 insertions(+), 168 deletions(-)
diff --git a/draft-guetschow-taler-protocol.md b/draft-guetschow-taler-protocol.md
@@ -340,11 +340,9 @@ out = (data == exp)
### Clause-Schnorr
-# The Taler Crypto Protocol
-
-## Datatypes
+# Datatypes
-### Amount
+## Amount
Amounts are represented in Taler as positive fixed-point values
consisting of `value` as the non-negative integer part of the base currency,
@@ -354,7 +352,7 @@ and `currency` as the 3-11 ASCII characters identifying the currency.
Whenever used in the protocol, the binary representation of an `amount` is
`uint64(amount.value) | uint32(amount.fraction) | padZero(12, amount.currency)`.
-### Timestamps
+## Timestamps
Absolute timestamps are represented as `uint64(x)` where `x` corresponds to
the microseconds since `1970-01-01 00:00 CEST` (the UNIX epoch).
@@ -365,7 +363,7 @@ Relative timestamps are represented as `uint64(x)` where `x` is given in microse
The special value `0xFFFFFFFFFFFFFFFF` represents "forever".
-->
-### Signatures
+## Signatures
All messages to be signed in Taler start with a header containing their size and
a fixed signing context (purpose) as registered by GANA in the
@@ -391,6 +389,8 @@ out = uint32(len(msg)) | uint32(purpose) | msg
// todo: explain persist, check, knows, sum, indexing (if left of equal sign, single entry; if not refers to whole list)
+# The Taler Crypto Protocol
+
## Withdrawal {#withdrawal}
The wallet generates `n > 0` coins (`coinᵢ`) and requests `n` signatures (`blind_sigᵢ`) from the exchange,
@@ -701,6 +701,26 @@ msg = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT,
check EdDSA-Verify(exchange.pub, msg, sig)
~~~
+## Refresh {#refresh}
+
+// todo
+
+## Refund {#refund}
+
+// todo
+
+## Recoup {#recoup}
+
+// todo
+
+## Wallet-to-Wallet Push Payment {#w2w-push}
+
+// todo
+
+## Wallet-to-Wallet Pull Payment {#w2w-pull}
+
+// todo
+
# Security Considerations
\[ TBD \]
diff --git a/draft-guetschow-taler-protocol.xml b/draft-guetschow-taler-protocol.xml
@@ -333,22 +333,20 @@ out = (data == exp)
</section>
</section>
</section>
- <section anchor="the-taler-crypto-protocol">
- <name>The Taler Crypto Protocol</name>
- <section anchor="datatypes">
- <name>Datatypes</name>
- <section anchor="amount">
- <name>Amount</name>
- <t>Amounts are represented in Taler as positive fixed-point values
+ <section anchor="datatypes">
+ <name>Datatypes</name>
+ <section anchor="amount">
+ <name>Amount</name>
+ <t>Amounts are represented in Taler as positive fixed-point values
consisting of <tt>value</tt> as the non-negative integer part of the base currency,
the <tt>fraction</tt> given in units of one hundred millionth (1e-8) of the base currency,
and <tt>currency</tt> as the 3-11 ASCII characters identifying the currency.</t>
- <t>Whenever used in the protocol, the binary representation of an <tt>amount</tt> is
+ <t>Whenever used in the protocol, the binary representation of an <tt>amount</tt> is
<tt>uint64(amount.value) | uint32(amount.fraction) | padZero(12, amount.currency)</tt>.</t>
- </section>
- <section anchor="timestamps">
- <name>Timestamps</name>
- <t>Absolute timestamps are represented as <tt>uint64(x)</tt> where <tt>x</tt> corresponds to
+ </section>
+ <section anchor="timestamps">
+ <name>Timestamps</name>
+ <t>Absolute timestamps are represented as <tt>uint64(x)</tt> where <tt>x</tt> corresponds to
the microseconds since <tt>1970-01-01 00:00 CEST</tt> (the UNIX epoch).
The special value <tt>0xFFFFFFFFFFFFFFFF</tt> represents "never".
<!--
@@ -356,15 +354,15 @@ The special value <tt>0xFFFFFFFFFFFFFFFF</tt> represents "never".
Relative timestamps are represented as `uint64(x)` where `x` is given in microseconds.
The special value `0xFFFFFFFFFFFFFFFF` represents "forever".
-->
- </t>
- </section>
- <section anchor="signatures">
- <name>Signatures</name>
- <t>All messages to be signed in Taler start with a header containing their size and
+ </t>
+ </section>
+ <section anchor="signatures">
+ <name>Signatures</name>
+ <t>All messages to be signed in Taler start with a header containing their size and
a fixed signing context (purpose) as registered by GANA in the
<eref target="https://gana.gnunet.org/gnunet-signatures/gnunet_signatures.html">GNUnet Signature Purposes</eref>
registry. Taler-related purposes start at 1000.</t>
- <artwork><![CDATA[
+ <artwork><![CDATA[
Sign-Msg(purpose, msg) -> out
Inputs:
@@ -374,13 +372,15 @@ Inputs:
Output:
out complete message (incl. header) to be signed
]]></artwork>
- <t><tt>out</tt> is formed as follows:</t>
- <artwork><![CDATA[
+ <t><tt>out</tt> is formed as follows:</t>
+ <artwork><![CDATA[
out = uint32(len(msg)) | uint32(purpose) | msg
]]></artwork>
- <t>// todo: explain persist, check, knows, sum, indexing (if left of equal sign, single entry; if not refers to whole list)</t>
- </section>
+ <t>// todo: explain persist, check, knows, sum, indexing (if left of equal sign, single entry; if not refers to whole list)</t>
</section>
+ </section>
+ <section anchor="the-taler-crypto-protocol">
+ <name>The Taler Crypto Protocol</name>
<section anchor="withdrawal">
<name>Withdrawal</name>
<t>The wallet generates <tt>n > 0</tt> coins (<tt>coinᵢ</tt>) and requests <tt>n</tt> signatures (<tt>blind_sigᵢ</tt>) from the exchange,
@@ -668,6 +668,26 @@ msg = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT,
check EdDSA-Verify(exchange.pub, msg, sig)
]]></artwork>
</section>
+ <section anchor="refresh">
+ <name>Refresh</name>
+ <t>// todo</t>
+ </section>
+ <section anchor="refund">
+ <name>Refund</name>
+ <t>// todo</t>
+ </section>
+ <section anchor="recoup">
+ <name>Recoup</name>
+ <t>// todo</t>
+ </section>
+ <section anchor="w2w-push">
+ <name>Wallet-to-Wallet Push Payment</name>
+ <t>// todo</t>
+ </section>
+ <section anchor="w2w-pull">
+ <name>Wallet-to-Wallet Pull Payment</name>
+ <t>// todo</t>
+ </section>
</section>
<section anchor="security-considerations">
<name>Security Considerations</name>
@@ -756,7 +776,7 @@ check EdDSA-Verify(exchange.pub, msg, sig)
<refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
</reference>
</references>
- <?line 712?>
+ <?line 732?>
<section anchor="change-log">
<name>Change log</name>
@@ -769,146 +789,147 @@ Education and Research (BMBF) within the project Concrete Contracts.</t>
</section>
</back>
<!-- ##markdown-source:
-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
+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
-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
-AA==
+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
+R+AFyWLSsv4XcFI2TK9YAAA=
-->