lsd0009

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

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:
Mdraft-guetschow-taler-protocol.md | 32++++++++++++++++++++++++++------
Mdraft-guetschow-taler-protocol.xml | 345++++++++++++++++++++++++++++++++++++++++++-------------------------------------
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 &gt; 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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 -AA== +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 +R+AFyWLSsv4XcFI2TK9YAAA= -->