lsd0009

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

draft-guetschow-taler-protocol.xml (147044B)


      1 <?xml version='1.0' encoding='utf-8'?>
      2 <!DOCTYPE rfc [
      3   <!ENTITY nbsp    "&#160;">
      4   <!ENTITY zwsp   "&#8203;">
      5   <!ENTITY nbhy   "&#8209;">
      6   <!ENTITY wj     "&#8288;">
      7 ]>
      8 <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
      9 <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.35 (Ruby 3.1.2) -->
     10 <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-guetschow-taler-protocol" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
     11   <!-- xml2rfc v2v3 conversion 3.32.0 -->
     12   <front>
     13     <title>The GNU Taler Protocol</title>
     14     <seriesInfo name="Internet-Draft" value="draft-guetschow-taler-protocol"/>
     15     <author initials="M." surname="Gütschow" fullname="Mikolai Gütschow">
     16       <organization abbrev="TU Dresden">TUD Dresden University of Technology</organization>
     17       <address>
     18         <postal>
     19           <street>Helmholtzstr. 10</street>
     20           <city>Dresden</city>
     21           <code>D-01069</code>
     22           <country>Germany</country>
     23         </postal>
     24         <email>mikolai.guetschow@tu-dresden.de</email>
     25       </address>
     26     </author>
     27     <date year="2026" month="May" day="12"/>
     28     <workgroup>independent</workgroup>
     29     <keyword>taler</keyword>
     30     <keyword>cryptography</keyword>
     31     <keyword>ecash</keyword>
     32     <keyword>payments</keyword>
     33     <abstract>
     34       <?line 45?>
     35 
     36 <t>[ TBW ]</t>
     37     </abstract>
     38   </front>
     39   <middle>
     40     <?line 49?>
     41 
     42 <section anchor="introduction">
     43       <name>Introduction</name>
     44       <t>[ TBW ]</t>
     45       <t>Beware that this document is still work-in-progress and may contain errors.
     46 Use at your own risk!</t>
     47     </section>
     48     <section anchor="notation">
     49       <name>Notation</name>
     50       <ul spacing="normal">
     51         <li>
     52           <t><tt>"abc"</tt> denotes the literal string <tt>abc</tt> encoded as ASCII <xref target="RFC20"/>, without trailing '\0' character.</t>
     53         </li>
     54         <li>
     55           <t><tt>a | b</tt> denotes the concatenation of a with b</t>
     56         </li>
     57         <li>
     58           <t><tt>len(a)</tt> denotes the length in bytes of the byte string a</t>
     59         </li>
     60         <li>
     61           <t><tt>padZero(y, a)</tt> denotes the byte string a, zero-padded to the length of y bytes</t>
     62         </li>
     63         <li>
     64           <t><tt>bits(x)</tt>/<tt>bytes(x)</tt> denotes the minimal number of bits/bytes necessary to represent the multiple precision integer x</t>
     65         </li>
     66         <li>
     67           <t><tt>uint(y, x)</tt> denotes the <tt>y</tt> least significant bits of the integer <tt>x</tt>, zero-padded and encoded in network byte order (big endian)</t>
     68         </li>
     69         <li>
     70           <t><tt>uintY(x)</tt> where <tt>Y</tt> is a positive integer number is equivalent to <tt>uint(Y, x)</tt></t>
     71         </li>
     72         <li>
     73           <t><tt>random(y)</tt> denotes a randomly generated sequence of y bits</t>
     74         </li>
     75         <li>
     76           <t><tt>a * b (mod N)</tt> / <tt>a ** b (mod N)</tt> denotes the multiplication / exponentiation of multiple precision integers a and b, modulo N</t>
     77         </li>
     78         <li>
     79           <t><tt>for</tt>, <tt>if</tt>, variable assignment <tt>=</tt>, and conditional operators are to be interpreted like their Python/Julia equivalents</t>
     80         </li>
     81         <li>
     82           <t><tt>data.key</tt> denotes the property <tt>key</tt> on the object <tt>data</tt></t>
     83         </li>
     84         <li>
     85           <t><tt>0..n</tt> denotes the exclusive range of integer numbers from <tt>0</tt> to <tt>n</tt>, i.e., <tt>0, 1, 2, ..., n-1</tt></t>
     86         </li>
     87         <li>
     88           <t><tt>⟨dataᵢ⟩</tt> within a context of <tt>i = 0..n</tt> denotes <tt>n</tt> objects <tt>dataᵢ</tt>, represented in memory as a continuous array</t>
     89         </li>
     90         <li>
     91           <t><tt>⟨dataᵢ.key⟩</tt> within a context of <tt>i = 0..n</tt> denotes an array of the <tt>n</tt> properties <tt>key</tt> of all <tt>n</tt> objects <tt>dataᵢ</tt></t>
     92         </li>
     93       </ul>
     94     </section>
     95     <section anchor="cryptographic-primitives">
     96       <name>Cryptographic Primitives</name>
     97       <t>// todo: maybe change this description to something more similar to protocol functions (Julia-inspired syntax)</t>
     98       <section anchor="cryptographic-hash-functions">
     99         <name>Cryptographic Hash Functions</name>
    100         <section anchor="sha256">
    101           <name>SHA-256</name>
    102           <artwork><![CDATA[
    103 SHA-256(msg) -> hash
    104 
    105 Input:
    106     msg     input message of length L < 2^61 octets
    107 
    108 Output:
    109     hash    message digest of fixed length HashLen = 32 octets
    110 ]]></artwork>
    111           <t><tt>hash</tt> is the output of SHA-256 as per Sections 4.1, 5.1, 6.1, and 6.2 of <xref target="RFC6234"/>.</t>
    112         </section>
    113         <section anchor="sha512">
    114           <name>SHA-512</name>
    115           <artwork><![CDATA[
    116 SHA-512(msg) -> hash
    117 
    118 Input:
    119     msg     input message of length L < 2^125 octets
    120 
    121 Output:
    122     hash    message digest of fixed length HashLen = 64 octets
    123 ]]></artwork>
    124           <t><tt>hash</tt> is the output of SHA-512 as per Sections 4.2, 5.2, 6.3, and 6.4 of <xref target="RFC6234"/>.</t>
    125         </section>
    126         <section anchor="sha512-trunc">
    127           <name>SHA-512-256 (truncated SHA-512)</name>
    128           <artwork><![CDATA[
    129 SHA-512-256(msg) -> hash
    130 
    131 Input:
    132     msg     input message of length L < 2^125 octets
    133 
    134 Output:
    135     hash    message digest of fixed length HashLen = 32 octets
    136 ]]></artwork>
    137           <t>The output <tt>hash</tt> corresponds to the first 32 octets of the output of SHA-512 defined in <xref target="sha512"/>:</t>
    138           <artwork><![CDATA[
    139 temp = SHA-512(msg)
    140 hash = temp[0:31]
    141 ]]></artwork>
    142           <t>Note that this operation differs from SHA-512/256 as defined in <xref target="SHS"/> in the initial hash value.</t>
    143         </section>
    144       </section>
    145       <section anchor="message-authentication-codes">
    146         <name>Message Authentication Codes</name>
    147         <section anchor="hmac">
    148           <name>HMAC</name>
    149           <artwork><![CDATA[
    150 HMAC-Hash(key, text) -> out
    151 
    152 Option:
    153     Hash    cryptographic hash function with output length HashLen
    154 
    155 Input:
    156     key     secret key of length at least HashLen
    157     text    input data of arbitary length
    158 
    159 Output:
    160     out     output of length HashLen
    161 ]]></artwork>
    162           <t><tt>out</tt> is calculated as defined in <xref target="RFC2104"/>.</t>
    163         </section>
    164       </section>
    165       <section anchor="key-derivation-functions">
    166         <name>Key Derivation Functions</name>
    167         <section anchor="hkdf">
    168           <name>HKDF</name>
    169           <t>The Hashed Key Derivation Function (HKDF) used in Taler is an instantiation of <xref target="RFC5869"/>
    170 with two different hash functions for the Extract and Expand step as suggested in <xref target="HKDF"/>:
    171 <tt>HKDF-Extract</tt> uses <tt>HMAC-SHA512</tt>, while <tt>HKDF-Expand</tt> uses <tt>HMAC-SHA256</tt> (cf. <xref target="hmac"/>).</t>
    172           <artwork><![CDATA[
    173 HKDF(salt, IKM, info, L) -> OKM
    174 
    175 Inputs:
    176     salt    optional salt value (a non-secret random value);
    177               if not provided, it is set to a string of 64 zeros.
    178     IKM     input keying material
    179     info    optional context and application specific information
    180               (can be a zero-length string)
    181     L       length of output keying material in octets
    182               (<= 255*32 = 8160)
    183 
    184 Output:
    185     OKM      output keying material (of L octets)
    186 ]]></artwork>
    187           <t>The output OKM is calculated as follows:</t>
    188           <artwork><![CDATA[
    189 PRK = HKDF-Extract(salt, IKM) with Hash = SHA-512 (HashLen = 64)
    190 OKM = HKDF-Expand(PRK, info, L) with Hash = SHA-256 (HashLen = 32)
    191 ]]></artwork>
    192         </section>
    193         <section anchor="hkdf-mod">
    194           <name>HKDF-Mod</name>
    195           <t>Based on the HKDF defined in <xref target="hkdf"/>, this function returns an OKM that is smaller than a given multiple precision integer N.</t>
    196           <artwork><![CDATA[
    197 HKDF-Mod(N, salt, IKM, info) -> OKM
    198 
    199 Inputs:
    200     N        multiple precision integer
    201     salt     optional salt value (a non-secret random value);
    202               if not provided, it is set to a string of 64 zeros.
    203     IKM      input keying material
    204     info     optional context and application specific information
    205               (can be a zero-length string)
    206 
    207 Output:
    208     OKM      output keying material (smaller than N)
    209 ]]></artwork>
    210           <t>The final output <tt>OKM</tt> is determined deterministically based on a counter initialized at zero.</t>
    211           <artwork><![CDATA[
    212 counter = 0
    213 do until OKM < N:
    214     x = HKDF(salt, IKM, info | uint16(counter), bytes(N))
    215     OKM = uint(bits(N), x)
    216     counter += 1
    217 ]]></artwork>
    218         </section>
    219       </section>
    220       <section anchor="non-blind-signatures">
    221         <name>Non-Blind Signatures</name>
    222         <section anchor="ed25519">
    223           <name>Ed25519</name>
    224           <t>Taler uses EdDSA instantiated with curve25519 as Ed25519,
    225 as defined in Section 5.1 of <xref target="RFC8032"/>.
    226 In particular, Taler does <em>not</em> make use of Ed25519ph or Ed25519ctx
    227 as defined in that document.</t>
    228           <section anchor="key-generation">
    229             <name>Key generation</name>
    230             <artwork><![CDATA[
    231 Ed25519-GetPub(priv) -> pub
    232 
    233 Input:
    234     priv    private Ed25519 key
    235 
    236 Output:
    237     pub     public Ed25519 key
    238 ]]></artwork>
    239             <t><tt>pub</tt> is calculated as described in Section 5.1.5 of <xref target="RFC8032"/>.</t>
    240             <artwork><![CDATA[
    241 Ed25519-Keygen() -> (priv, pub)
    242 
    243 Output:
    244     priv    private Ed25519 key
    245     pub     public Ed25519 key
    246 ]]></artwork>
    247             <t><tt>priv</tt> and <tt>pub</tt> are calculated as described in Section 5.1.5 of <xref target="RFC8032"/>,
    248 which is equivalent to the following:</t>
    249             <artwork><![CDATA[
    250 priv = random(256)
    251 pub = Ed25519-GetPub(priv)
    252 ]]></artwork>
    253           </section>
    254           <section anchor="signing">
    255             <name>Signing</name>
    256             <artwork><![CDATA[
    257 Ed25519-Sign(priv, msg) -> sig
    258 
    259 Inputs:
    260     priv    Ed25519 private key
    261     msg     message to be signed
    262 
    263 Output:
    264     sig     signature on the message by the given private key
    265 ]]></artwork>
    266             <t><tt>sig</tt> is calculated as described in Section 5.1.6 of <xref target="RFC8032"/>.</t>
    267           </section>
    268           <section anchor="verifying">
    269             <name>Verifying</name>
    270             <artwork><![CDATA[
    271 Ed25519-Verify(pub, msg, sig) -> out
    272 
    273 Inputs:
    274     pub     Ed25519 public key
    275     msg     signed message
    276     sig     signature on msg
    277 
    278 Output:
    279     out     true, if sig is a valid signature for msg
    280 ]]></artwork>
    281             <t><tt>out</tt> is the outcome of the last check of Section 5.1.7 of <xref target="RFC8032"/>.</t>
    282           </section>
    283         </section>
    284       </section>
    285       <section anchor="key-agreement">
    286         <name>Key Agreement</name>
    287         <section anchor="x25519">
    288           <name>X25519</name>
    289           <t>Taler uses Elliptic Curve Diffie-Hellman (ECDH) on curve25519 as defined in Section 6.1 of <xref target="RFC7748"/>,
    290 but reuses Ed25519 keypairs for one side of the agreement instead of random bytes.
    291 Depending on whether the private or public part is from Ed25519, two different functions are used.</t>
    292           <artwork><![CDATA[
    293 ECDH-Ed25519-Priv(priv, pub) -> shared
    294 
    295 Input:
    296     priv    private Ed25519 key
    297     pub     public X25519 key
    298 
    299 Output:
    300     shared  shared secret based on the given keys
    301 ]]></artwork>
    302           <t><tt>shared</tt> is calculated as follows, using the function X25519 defined in Section 5 of <xref target="RFC7748"/>:</t>
    303           <artwork><![CDATA[
    304 priv' = SHA-512-256(priv)
    305 // todo: missing bit clamping from https://github.com/jedisct1/libsodium/blob/master/src/libsodium/crypto_sign/ed25519/ref10/keypair.c#L71
    306 shared' = X25519(priv', pub)
    307 shared = SHA-512(shared')
    308 ]]></artwork>
    309           <artwork><![CDATA[
    310 ECDH-Ed25519-Pub(priv, pub) -> shared
    311 
    312 Input:
    313     priv    private X25519 key
    314     pub     public Ed25519 key
    315 
    316 Output:
    317     shared  shared secret based on the given keys
    318 ]]></artwork>
    319           <t><tt>shared</tt> is calculated as follows, using the function X25519 defined in Section 5 of <xref target="RFC7748"/>,
    320 and <tt>Convert-Point-Ed25519-Curve25519(p)</tt> which implements the birational map of Section 4.1 of <xref target="RFC7748"/>:</t>
    321           <artwork><![CDATA[
    322 pub' = Convert-Point-Ed25519-Curve25519(pub)
    323 shared' = X25519(priv, pub')
    324 shared = SHA-512(shared')
    325 ]]></artwork>
    326           <artwork><![CDATA[
    327 ECDH-GetPub(priv) -> pub
    328 
    329 Input:
    330     priv    private X25519 key
    331 
    332 Output:
    333     pub     public X25519 key
    334 ]]></artwork>
    335           <t><tt>pub</tt> is calculated according to Section 6.1 of <xref target="RFC7748"/>:</t>
    336           <artwork><![CDATA[
    337 pub = X25519(priv, 9)
    338 ]]></artwork>
    339         </section>
    340       </section>
    341       <section anchor="blind-signatures">
    342         <name>Blind Signatures</name>
    343         <section anchor="rsa-fdh">
    344           <name>RSA-FDH</name>
    345           <section anchor="supporting-functions">
    346             <name>Supporting Functions</name>
    347             <artwork><![CDATA[
    348 RSA-FDH(msg, pubkey) -> fdh
    349 
    350 Inputs:
    351     msg     message
    352     pubkey  RSA public key consisting of modulus N and public exponent e
    353 
    354 Output:
    355     fdh     full-domain hash of msg over pubkey.N
    356 ]]></artwork>
    357             <t><tt>fdh</tt> is calculated based on HKDF-Mod from <xref target="hkdf-mod"/> as follows:</t>
    358             <artwork><![CDATA[
    359 info = "RSA-FDA FTpsW!"
    360 salt = uint16(bytes(pubkey.N)) | uint16(bytes(pubkey.e))
    361      | pubkey.N | pubkey.e
    362 fdh = HKDF-Mod(pubkey.N, salt, msg, info)
    363 ]]></artwork>
    364             <t>The resulting <tt>fdh</tt> can be used to test against a malicious RSA pubkey
    365 by verifying that the greatest common denominator (gcd) of <tt>fdh</tt> and <tt>pubkey.N</tt> is 1.</t>
    366             <artwork><![CDATA[
    367 RSA-FDH-Derive(bks, pubkey) -> out
    368 
    369 Inputs:
    370     bks     blinding key secret of length L = 32 octets
    371     pubkey  RSA public key consisting of modulus N and public exponent e
    372 
    373 Output:
    374     out     full-domain hash of bks over pubkey.N
    375 ]]></artwork>
    376             <t><tt>out</tt> is calculated based on HKDF-Mod from <xref target="hkdf-mod"/> as follows:</t>
    377             <artwork><![CDATA[
    378 info = "Blinding KDF"
    379 salt = "Blinding KDF extractor HMAC key"
    380 fdh = HKDF-Mod(pubkey.N, salt, bks, info)
    381 ]]></artwork>
    382           </section>
    383           <section anchor="blinding">
    384             <name>Blinding</name>
    385             <artwork><![CDATA[
    386 RSA-FDH-Blind(msg, bks, pubkey) -> out
    387 
    388 Inputs:
    389     msg     message
    390     bks     blinding key secret of length L = 32 octets
    391     pubkey  RSA public key consisting of modulus N and public exponent e
    392 
    393 Output:
    394     out     message blinded for pubkey
    395 ]]></artwork>
    396             <t><tt>out</tt> is calculated based on RSA-FDH from <xref target="rsa-fdh"/> as follows:</t>
    397             <artwork><![CDATA[
    398 data = RSA-FDH(msg, pubkey)
    399 r = RSA-FDH-Derive(bks, pubkey)
    400 r_e = r ** pubkey.e (mod pubkey.N)
    401 out = r_e * data (mod pubkey.N)
    402 ]]></artwork>
    403           </section>
    404           <section anchor="signing-1">
    405             <name>Signing</name>
    406             <artwork><![CDATA[
    407 RSA-FDH-Sign(data, privkey) -> sig
    408 
    409 Inputs:
    410     data    data to be signed, an integer smaller than privkey.N
    411     privkey RSA private key consisting of modulus N and private exponent d
    412 
    413 Output:
    414     sig     signature on data by privkey
    415 ]]></artwork>
    416             <t><tt>sig</tt> is calculated as follows:</t>
    417             <artwork><![CDATA[
    418 sig = data ** privkey.d (mod privkey.N)
    419 ]]></artwork>
    420           </section>
    421           <section anchor="unblinding">
    422             <name>Unblinding</name>
    423             <artwork><![CDATA[
    424 RSA-FDH-Unblind(sig, bks, pubkey) -> out
    425 
    426 Inputs:
    427     sig     blind signature
    428     bks     blinding key secret of length L = 32 octets
    429     pubkey  RSA public key consisting of modulus N and public exponent e
    430 
    431 Output:
    432     out     unblinded signature
    433 ]]></artwork>
    434             <t><tt>out</tt> is calculated as follows:</t>
    435             <artwork><![CDATA[
    436 r = RSA-FDH-Derive(bks, pubkey)
    437 r_inv = inverse of r (mod pubkey.N)
    438 out = sig * r_inv (mod pubkey.N)
    439 ]]></artwork>
    440           </section>
    441           <section anchor="verifying-1">
    442             <name>Verifying</name>
    443             <artwork><![CDATA[
    444 RSA-FDH-Verify(msg, sig, pubkey) -> out
    445 
    446 Inputs:
    447     msg     message
    448     sig     signature of pubkey over msg
    449     pubkey  RSA public key consisting of modulus N and public exponent e
    450 
    451 Output:
    452     out     true, if sig is a valid signature
    453 ]]></artwork>
    454             <t><tt>out</tt> is calculated based on RSA-FDH from <xref target="rsa-fdh"/> as follows:</t>
    455             <artwork><![CDATA[
    456 data = RSA-FDH(msg, pubkey)
    457 exp = sig ** pubkey.e (mod pubkey.N)
    458 out = (data == exp)
    459 ]]></artwork>
    460           </section>
    461         </section>
    462         <section anchor="cbs">
    463           <name>Clause-Schnorr</name>
    464         </section>
    465       </section>
    466     </section>
    467     <section anchor="datatypes-and-notation">
    468       <name>Datatypes and Notation</name>
    469       <section anchor="amounts">
    470         <name>Amounts</name>
    471         <t>Amounts are represented in Taler as positive fixed-point values
    472 consisting of <tt>value</tt> as the non-negative integer part of the base currency,
    473 the <tt>fraction</tt> given in units of one hundred millionth (1e-8) of the base currency,
    474 and <tt>currency</tt> as the 3-11 ASCII characters identifying the currency.</t>
    475         <t>Whenever used in the protocol, the binary representation of an <tt>amount</tt> is
    476 <tt>uint64(amount.value) | uint32(amount.fraction) | padZero(12, amount.currency)</tt>.</t>
    477       </section>
    478       <section anchor="timestamps">
    479         <name>Timestamps</name>
    480         <t>Absolute timestamps are represented as <tt>uint64(x)</tt> where <tt>x</tt> corresponds to
    481 the microseconds since <tt>1970-01-01 00:00 CEST</tt> (the UNIX epoch).
    482 The special value <tt>0xFFFFFFFFFFFFFFFF</tt> represents "never".
    483 <!--
    484 // todo: check if needed and correct
    485 Relative timestamps are represented as `uint64(x)` where `x` is given in microseconds.
    486 The special value `0xFFFFFFFFFFFFFFFF` represents "forever".
    487 -->
    488         </t>
    489       </section>
    490       <section anchor="signatures">
    491         <name>Signatures</name>
    492         <t>All messages to be signed in Taler start with a header containing their total size
    493 (including the header) and a fixed signing context (purpose) as registered by GANA in the
    494 <eref target="https://gana.gnunet.org/gnunet-signatures/gnunet_signatures.html">GNUnet Signature Purposes</eref>
    495 registry. Taler-specific purposes start at 1000.</t>
    496         <artwork><![CDATA[
    497 Gen-Msg(purpose, msg) -> out
    498 
    499 Inputs:
    500     purpose signature purpose as registered at GANA
    501     msg     message content (excl. header) to be signed
    502 
    503 Output:
    504     out     complete message (incl. header) to be signed
    505 ]]></artwork>
    506         <t><tt>out</tt> is formed as follows:</t>
    507         <artwork><![CDATA[
    508 out = uint32(len(msg) + 8) | uint32(purpose) | msg
    509 ]]></artwork>
    510       </section>
    511       <section anchor="helper-functions">
    512         <name>Helper Functions</name>
    513         <t>There are a certain number of single-argument functions which are often needed,
    514 and therefore omit the parentheses of the typical function syntax:</t>
    515         <ul spacing="normal">
    516           <li>
    517             <t><tt>Knows data</tt> specifies <tt>data</tt> that is known a priori at the start of the protocol operation</t>
    518           </li>
    519           <li>
    520             <t><tt>Check cond</tt> verifies that the boolean condition or variable <tt>cond</tt> is true,
    521 or aborts the protocol operation otherwise</t>
    522           </li>
    523           <li>
    524             <t><tt>Persist data</tt> persists the given <tt>data</tt> to the local database</t>
    525           </li>
    526           <li>
    527             <t><tt>data = Lookup by key</tt> retrieves previously persisted <tt>data</tt> by the given <tt>key</tt></t>
    528           </li>
    529           <li>
    530             <t><tt>Sum ⟨dataᵢ⟩</tt> is valid for numerical objects <tt>dataᵢ</tt> including amounts (cf. <xref target="amounts"/>),
    531 and denotes the numerical sum of these objects</t>
    532           </li>
    533         </ul>
    534         <t>Some more functions that are commonly used throughout <xref target="protocol"/>:</t>
    535         <artwork><![CDATA[
    536 Hash-Denom(denom) =
    537   SHA-512(uint32(0) | uint32(1) | denom.pub)
    538 
    539 Hash-Planchet(planchet, denom) =
    540   SHA-512( SHA-512( denom.pub ) | uint32(0x1) | planchet )
    541 
    542 Check-Subtract(value, subtrahend) =
    543   Check value >= subtrahend
    544   Persist value -= subtrahend
    545 ]]></artwork>
    546       </section>
    547     </section>
    548     <section anchor="protocol">
    549       <name>The Taler Crypto Protocol</name>
    550       <t>The Taler payment protocol is a token-based <em>e-cash</em> system
    551 which ensures anonymity for payers (much like physical cash),
    552 while guaranteing income transparency on the payees' side (much like most digital payment systems).
    553 Contrary to what the name might suggest,
    554 Taler neither is a separate currency (as cryptocurrencies do)
    555 nor is it tied to a specific currency.
    556 Instead, the payment system operator offering the Taler payment protocol
    557 can freely choose the assets backing the payment system.</t>
    558       <t>The basic system consists of three types of entities:</t>
    559       <ol spacing="normal" type="1"><li>
    560           <t>The Taler <em>exchange</em> is run by the payment system operator.
    561 It is the central, trusted entity which hands out e-cash and holds the corresponding value.</t>
    562         </li>
    563         <li>
    564           <t>A Taler <em>wallet</em> manages e-cash in self-custody for end users.</t>
    565         </li>
    566         <li>
    567           <t>A Taler <em>merchant</em> can redeem e-cash at the exchange
    568 after the wallet authorized a deposit permission during a payment.</t>
    569         </li>
    570       </ol>
    571       <t>E-cash in Taler is represented as digital tokens called <em>coins</em>.
    572 They are public-private keypairs where ownership of the coin
    573 is equivalent to the knowledge of the private key <tt>coin.priv</tt>.
    574 Every coin has an initial value corresponding to a denomination (<tt>denom</tt>) offered by the exchange.
    575 The validity of coins is signaled by the presence of
    576 a valid denomination signature <tt>coin.sig</tt> on the (hash of the) public key <tt>coin.pub</tt>.
    577 To ensure payer anonymity, the exchange generates <tt>coin.sig</tt> without learning the actual (hash of) <tt>coin.pub</tt>
    578 using a <em>blind</em> signature scheme.</t>
    579       <t>Wallets obtain coins from the exchange during <em>withdrawal</em> (cf. <xref target="withdraw"/>)
    580 and use them during <em>payment</em> at merchants, who in turn <em>deposit</em> them at the exchange (cf. <xref target="payment"/>).
    581 Residual value on partly spent coins can be <em>refreshed</em> by the wallet subsequently in order to obtain unlinkable change (cf. <xref target="refresh"/>).
    582 Taler also supports receiving e-cash in a wallet without acting as a merchant using <em>wallet-to-wallet payments</em> (W2W, cf. <xref target="w2w"/>),
    583 which are always handled via the exchange.</t>
    584       <t>Honest operation of the exchange can be optionally supervised by an independant third-party Taler <em>auditor</em>.
    585 This supervision is not part of the basic Taler protocol and thus not part of this document.</t>
    586       <artwork><![CDATA[
    587                  - exchange -
    588                 /            \
    589    Withdrawal  /              \  Deposit
    590      Refresh  /  W2W           \
    591              /                  \
    592           wallet ----------- merchant
    593                    Payment
    594 ]]></artwork>
    595       <t>// todo: capitalize wallet, exchange, merchant everywhere?</t>
    596       <t>In the default configuration, Taler uses RSA-FDH (cf. <xref target="rsa-fdh"/>) for (blind) denomination signatures
    597 and Ed25519 (cf. <xref target="ed25519"/>) signatures everywhere else.
    598 Clause-Schnorr Signatures (cf. <xref target="cbs"/>) provide an alternative blind signature scheme operating on Elliptic Curves.
    599 As their usage is still experimental, they are not described as part of this document.</t>
    600       <t>Taler has optional support for age-restricted coins, enabling privacy-preserving age restriction.
    601 As an optional feature, it is not part of the basic Taler protocol and thus left out of the description in this document.</t>
    602       <section anchor="obtaining-e-cash">
    603         <name>Obtaining E-Cash</name>
    604         <section anchor="withdraw">
    605           <name>Withdrawal</name>
    606           <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,
    607 attributing value to the coins according to <tt>n</tt> chosen denominations <tt>⟨denomᵢ⟩</tt>.
    608 The total value and withdrawal fee (defined by the exchange per denomination)
    609 must be smaller or equal to the amount stored in the single reserve used for withdrawal.</t>
    610           <t>// todo: document TALER_MAX_COINS = 64 per operation (due to CS-encoding)</t>
    611           <t>// todo: extend with extra roundtrip for CBS</t>
    612           <artwork><![CDATA[
    613             wallet                                  exchange
    614 Knows ⟨denomᵢ⟩                          Knows ⟨denomᵢ.priv⟩
    615                |                                        |
    616 +-----------------------------+                         |
    617 | (W1) reserve key generation |                         |
    618 +-----------------------------+                         |
    619                |                                        |
    620                |----------- (bank transfer) ----------->|
    621                | (subject: reserve.pub, amount: value)  |
    622                |                                        |
    623                |                      +------------------------------+
    624                |                      | Persist (reserve.pub, value) |
    625                |                      +------------------------------+
    626                |                                        |
    627 +-----------------------------------+                   |
    628 | (W2) coin generation and blinding |                   |
    629 +-----------------------------------+                   |
    630                |                                        |
    631                |-------------- /withdraw -------------->|
    632                |    (reserve.pub, planchets, sig)       |
    633                |                                        |
    634                |                      +--------------------------------+
    635                |                      | (E1) coin issuance and signing |
    636                |                      +--------------------------------+
    637                |                                        |
    638                |<---------- (⟨blind_sigᵢ⟩) -------------|
    639                |                                        |
    640 +----------------------+                                |
    641 | (W3) coin unblinding |                                |
    642 +----------------------+                                |
    643                |                                        |
    644 ]]></artwork>
    645           <t>where (for RSA, without age-restriction)</t>
    646           <sourcecode type="pseudocode"><![CDATA[
    647 (W1) reserve key generation (wallet)
    648 
    649 reserve = Ed25519-Keygen()
    650 Persist (reserve, value)
    651 ]]></sourcecode>
    652           <t>The wallet derives coins and blinding secrets using a HKDF from a single seed per withdrawal operation,
    653 together with an integer index.
    654 This is strictly speaking an implementation detail since the seed is never revealed to any other party,
    655 and might be chosen to be implemented differently.</t>
    656           <sourcecode type="pseudocode"><![CDATA[
    657 (W2) coin generation and blinding (wallet)
    658 
    659 batch_seed = random(256)
    660 Persist batch_seed
    661 for i in 0..n:
    662   coin_seedᵢ = HKDF(uint32(i), batch_seed, "taler-withdrawal-coin-derivation", 64)
    663   blind_secretᵢ = coin_seedᵢ[32:]
    664   coinᵢ.priv = coin_seedᵢ[:32]
    665   coinᵢ.pub = Ed25519-GetPub(coinᵢ.priv)
    666   h_denomᵢ = Hash-Denom(denomᵢ)
    667   planchetᵢ = RSA-FDH-Blind(SHA-512(coinᵢ.pub), blind_secretᵢ, denomᵢ.pub)
    668   h_planchetᵢ = Hash-Planchet(planchetᵢ, denomᵢ)
    669 planchets = (⟨h_denomᵢ⟩, ⟨planchetᵢ⟩)
    670 msg = Gen-Msg(WALLET_RESERVE_WITHDRAW,
    671     ( Sum ⟨denomᵢ.value⟩ | Sum ⟨denomᵢ.fee_withdraw⟩
    672     | SHA-512( ⟨h_planchetᵢ⟩ ) | uint256(0x0) | uint32(0x0) | uint32(0x0) ))
    673 sig = Ed25519-Sign(reserve.priv, msg)
    674 
    675 // todo: exchange.git uses different derivation than wallet-core.git (above):
    676 ⟨coin_seedᵢ⟩ = HKDF(uint32(n), batch_seed, "taler-withdraw-secrets", 32*n)
    677 for i in 0..n:
    678   blind_secretᵢ = HKDF("bks", coin_seedᵢ, "", 32)
    679   coinᵢ.priv = HKDF("coin", coin_seedᵢ, "", 32)
    680 ]]></sourcecode>
    681           <sourcecode type="pseudocode"><![CDATA[
    682 (E1) coin issuance and signing (exchange)
    683 
    684 (⟨h_denomᵢ⟩, ⟨planchetᵢ⟩) = planchets
    685 for i in 0..n:
    686   denomᵢ = Lookup by h_denomᵢ
    687   Check denomᵢ known and not withdraw-expired
    688   h_planchetᵢ = Hash-Planchet(planchetᵢ, denomᵢ)
    689 msg = Gen-Msg(WALLET_RESERVE_WITHDRAW,
    690     ( Sum ⟨denomᵢ.value⟩ | Sum ⟨denomᵢ.fee_withdraw⟩
    691     | SHA-512( ⟨h_planchetᵢ⟩ ) | uint256(0x0) | uint32(0x0) | uint32(0x0) ))
    692 Check Ed25519-Verify(reserve.pub, msg, sig)
    693 Check reserve KYC status ok or not needed
    694 total = Sum ⟨denomᵢ.value⟩ + Sum ⟨denomᵢ.fee_withdraw⟩
    695 Check-Subtract(reserve.balance, total)
    696 for i in 0..n:
    697   blind_sigᵢ = RSA-FDH-Sign(planchetᵢ, denomᵢ.priv)
    698 Persist withdrawal // todo: what exactly? should be checked first for replay?
    699 ]]></sourcecode>
    700           <sourcecode type="pseudocode"><![CDATA[
    701 (W3) coin unblinding (wallet)
    702 
    703 for i in 0..n:
    704   coinᵢ.sig = RSA-FDH-Unblind(blind_sigᵢ, blind_secretᵢ, denomᵢ.pub)
    705   Check RSA-FDH-Verify(SHA-512(coinᵢ.pub), coinᵢ.sig, denomᵢ.pub)
    706   coinᵢ.h_denom = h_denomᵢ
    707   coinᵢ.blind_secret = blind_secretᵢ  // todo: why save blind_secret, if batch_seed already persisted?
    708 Persist ⟨coinᵢ⟩
    709 ]]></sourcecode>
    710         </section>
    711         <section anchor="withdraw-recoup">
    712           <name>Recoup</name>
    713           <t>// todo</t>
    714         </section>
    715       </section>
    716       <section anchor="payment-with-e-cash">
    717         <name>Payment with E-Cash</name>
    718         <section anchor="payment">
    719           <name>Payment and Deposit</name>
    720           <t>The wallet obtains <tt>contract</tt> information for an <tt>order</tt> from the merchant
    721 after claiming it with a <tt>nonce</tt>.
    722 Payment of the order is prepared by signing (partial) deposit authorizations <tt>⟨depositᵢ⟩</tt> with coins <tt>⟨coinᵢ⟩</tt> of certain denominations <tt>⟨denomᵢ⟩</tt>,
    723 where the sum of all contributions (<tt>contributionᵢ &lt;= denomᵢ.value</tt>) must match the <tt>contract.price</tt> plus potential deposit fees.
    724 The payment is complete as soon as the merchant successfully redeems the deposit authorizations at the exchange.</t>
    725           <t>Deposit could also be used directly by a wallet with its own payto and a minimal contract.</t>
    726           <t>// todo: should we integrate payment templates here?</t>
    727           <artwork><![CDATA[
    728       wallet                        merchant                       exchange
    729 Knows ⟨coinᵢ⟩                  Knows merchant.priv         Knows exchange.priv
    730         |                      Knows exchange, payto       Knows ⟨denomᵢ⟩
    731         |                              |                              |
    732         |                 +-----------------------+                   |
    733         |                 | (M1) order generation |                   |
    734         |                 +-----------------------+                   |
    735         |                              |                              |
    736         |<--- (QR-Code / NFC / URI) ---|                              |
    737         |      (order.{id,token?})     |                              |
    738         |                              |                              |
    739 +-----------------------+              |                              |
    740 | (W1) nonce generation |              |                              |
    741 +-----------------------+              |                              |
    742         |                              |                              |
    743         |-- /orders/{order.id}/claim ->|                              |
    744         |  (nonce.pub, order.token?)   |                              |
    745         |                              |                              |
    746         |                 +--------------------------+                |
    747         |                 | (M2) contract generation |                |
    748         |                 +--------------------------+                |
    749         |                              |                              |
    750         |<-- (contract, merchant.pub, -|                              |
    751         |            sig)              |                              |
    752         |                              |                              |
    753 +--------------------------+           |                              |
    754 | (W2) payment preparation |           |                              |
    755 +--------------------------+           |                              |
    756         |                              |                              |
    757         |--- /orders/{order.id}/pay -->|                              |
    758         |         (⟨depositᵢ⟩)         |                              |
    759         |                              |                              |
    760         |                 +--------------------------+                |
    761         |                 | (M3) deposit preparation |                |
    762         |                 +--------------------------+                |
    763         |                              |                              |
    764         |                              |-------- /batch-deposit ----->|
    765         |                              | (info, h_contract, ⟨depositᵢ⟩|
    766         |                              |        merchant.pub, sig)    |
    767         |                              |                              |
    768         |                              |                  +--------------------+
    769         |                              |                  | (E1) deposit check |
    770         |                              |                  +--------------------+
    771         |                              |                              |
    772         |                              |<------ (time_deposit, -------|
    773         |                              |      exchange.pub, sig)      |
    774         |                              |                              |
    775         |                 +---------------------------+               |
    776         |                 | (M4) deposit verification |               |
    777         |                 +---------------------------+               |
    778         |                              |                              |
    779         |<----------- (sig) -----------|                              |
    780         |                              |                              |
    781 +---------------------------+          |                              |
    782 | (W3) payment verification |          |                              |
    783 +---------------------------+          |                              |
    784         |                              |                              |
    785 ]]></artwork>
    786           <t>where (without age restriction, policy and wallet data hash)</t>
    787           <sourcecode type="pseudocode"><![CDATA[
    788 (M1) order generation (merchant)
    789 
    790 wire_salt = random(128)
    791 determine price, and ASCII strings id, info, token?
    792 Persist order = (id, price, info, token?, wire_salt)
    793 ]]></sourcecode>
    794           <sourcecode type="pseudocode"><![CDATA[
    795 (W1) nonce generation (wallet)
    796 
    797 nonce = Ed25519-Keygen()
    798 Persist nonce.priv
    799 ]]></sourcecode>
    800           <t>Note that the private key of <tt>nonce</tt> is currently not used anywhere in the protocol.
    801 However, it could be used in the future to prove ownership of an order transaction,
    802 enabling use-cases such as "unclaiming" or transferring an order to another person,
    803 or proving the payment without resorting to the individual coins.</t>
    804           <sourcecode type="pseudocode"><![CDATA[
    805 (M2) contract generation (merchant)
    806 
    807 Check order.token? == token?
    808 h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64)
    809 timestamp = now()
    810 determine refund_deadline, wire_deadline from timestamp
    811 contract = (order.{id,price,info,token?}, exchange, h_wire, timestamp, refund_deadline, wire_deadline)
    812 contract.nonce = nonce.pub
    813 Persist contract
    814 h_contract = SHA-512(canonicalJSON(contract))
    815 msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
    816 sig = Ed25519-Sign(merchant.priv, msg)
    817 ]]></sourcecode>
    818           <sourcecode type="pseudocode"><![CDATA[
    819 (W2) payment preparation (wallet)
    820 
    821 h_contract = SHA-512(canonicalJSON(contract))
    822 msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
    823 Check Ed25519-Verify(merchant.pub, msg, sig)
    824 Check contract.nonce == nonce
    825 // TODO: double-check extra hash check?
    826 // todo: maybe get rid of CoinSelection altogether by claiming we already know coinᵢ and contributionᵢ
    827 ⟨selectionᵢ⟩ = CoinSelection(contract.{exchange,price}) TODO: include MarkDirty here
    828 for i in 0..n:
    829   (coinᵢ, denomᵢ, contributionᵢ) = selectionᵢ
    830   msgᵢ = Gen-Msg(WALLET_COIN_DEPOSIT,
    831       ( h_contract | uint256(0x0)
    832       | uint512(0x0) | contract.h_wire | coinᵢ.h_denom
    833       | timestamp | contract.refund_deadline
    834       | contributionᵢ + denomᵢ.fee_deposit
    835       | denomᵢ.fee_deposit | merchant.pub | uint512(0x0) ))
    836   sigᵢ = Ed25519-Sign(coinᵢ.priv, msgᵢ)
    837   depositᵢ = (coinᵢ.{pub,sig,h_denom}, contributionᵢ, sigᵢ)
    838 Persist (contract, ⟨sigᵢ⟩, ⟨depositᵢ⟩)
    839 ]]></sourcecode>
    840           <t>// TODO: explain CoinSelection</t>
    841           <sourcecode type="pseudocode"><![CDATA[
    842 (M3) deposit preparation (merchant)
    843 
    844 Check Sum ⟨depositᵢ.contribution⟩ == contract.price
    845 info.time = contract.{timestamp, wire_deadline, refund_deadline}
    846 info.wire = (payto, wire_salt)
    847 h_contract = SHA-512(canonicalJSON(contract))
    848 msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
    849 sig = Ed25519-Sign(merchant.priv, msg)
    850 ]]></sourcecode>
    851           <t>TODO: what about wire_fees, those should be checked for as well, or do we just assume merchant will pay those?
    852 see src/backend/taler-merchant-httpd_post-orders-ORDER_ID-pay.c:2760</t>
    853           <sourcecode type="pseudocode"><![CDATA[
    854 (E1) deposit check (exchange)
    855 
    856 h_wire = HKDF(info.wire.wire_salt, info.wire.payto, "merchant-wire-signature", 64)
    857 for i in 0..n:
    858   coinᵢ = depositᵢ.coin
    859   denomᵢ = Lookup by coinᵢ.h_denom
    860   Check denomᵢ known and not deposit-expired
    861   totalᵢ = depositᵢ.contribution + denomᵢ.fee_deposit
    862   msgᵢ = Gen-Msg(WALLET_COIN_DEPOSIT,
    863       ( h_contract | uint256(0x0)
    864       | uint512(0x0) | h_wire | coinᵢ.h_denom
    865       | info.time.timestamp | info.time.refund_deadline
    866       | totalᵢ
    867       | denomᵢ.fee_deposit | merchant.pub | uint512(0x0) ))
    868   Check Ed25519-Verify(coinᵢ.pub, msgᵢ, depositᵢ.sig)
    869   Check RSA-FDH-Verify(SHA-512(coinᵢ.pub), coinᵢ.sig, denomᵢ.pub)
    870   Check-Subtract(coinᵢ.value, total)
    871 Persist deposit-record
    872 schedule bank transfer to payto
    873 time_deposit = now()
    874 msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT,
    875     ( h_contract | h_wire | uint512(0x0)
    876     | time_deposit | info.time.wire_deadline
    877     | info.time.refund_deadline
    878     | Sum ⟨depositᵢ.contribution⟩
    879     | SHA-512( ⟨depositᵢ.sig⟩ ) | merchant.pub ))
    880 sig = Ed25519-Sign(exchange.priv, msg)
    881 ]]></sourcecode>
    882           <sourcecode type="pseudocode"><![CDATA[
    883 (M2) deposit verification (merchant)
    884 
    885 h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64)
    886 msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT,
    887     ( h_contract | h_wire | uint512(0x0)
    888     | time_deposit | contract.wire_deadline
    889     | contract.refund_deadline
    890     | Sum ⟨depositᵢ.contribution⟩
    891     | SHA-512( ⟨depositᵢ.sig⟩ ) | merchant.pub ))
    892 Check Ed25519-Verify(exchange.pub, msg, sig)
    893 msg = Gen-Msg(MERCHANT_PAYMENT_OK, h_contract)
    894 sig = Ed25519-Sign(merchant.priv, msg)
    895 ]]></sourcecode>
    896           <sourcecode type="pseudocode"><![CDATA[
    897 (W3) payment verification (wallet)
    898 
    899 msg = Gen-Msg(MERCHANT_PAYMENT_OK, h_contract)
    900 Check Ed25519-Verify(merchant.pub, msg, sig)
    901 ]]></sourcecode>
    902         </section>
    903         <section anchor="refund">
    904           <name>Refund</name>
    905           <t>A wallet can request a refund for an order from the merchant after it has been completed successfully
    906 (cf. <xref target="payment"/>) and before the merchant has been paid out by the exchange (i.e., before <tt>contract.wire_deadline</tt>).
    907 The merchant needs to approve the refund via its business logic,
    908 and is free to decide the total amount of the refund
    909 as well as which coins' deposit operations are (potentially partly) invalidated.
    910 After the exchange has accepted the refund request,
    911 the coins obtain their (partial) value back.
    912 The wallet should proceed to refresh (cf. <xref target="refresh"/>) the coins before spending them again
    913 to obtain unlinkability.</t>
    914           <t>In case the wallet itself has used deposit to its own payto,
    915 it can act as the merchant in the protocol below.</t>
    916           <artwork><![CDATA[
    917       wallet                        merchant                       exchange
    918 Knows order.id                 Knows merchant.priv         Knows deposit_record
    919 Knows contract                         |                         for coinᵢ.pub
    920         |                              |                              |
    921 +---------------------+                |                              |
    922 | (W1) refund request |                |                              |
    923 +---------------------+                |                              |
    924         |                              |                              |
    925         |- /orders/{order.id}/refund ->|                              |
    926         |          (h_contract)        |                              |
    927         |                              |                              |
    928         |                 +------------------------+                  |
    929         |                 | (M1) refund processing |                  |
    930         |                 +------------------------+                  |
    931         |                              |                              |
    932         |                              |- /coins/{coinᵢ.pub}/refund ->|
    933         |                              |   (valueᵢ, h_contract, id,   |
    934         |                              |      merchant.pub, sigᵢ)     |
    935         |                              |                              |
    936         |                              |                  +-------------------+
    937         |                              |                  | (E1) refund check |
    938         |                              |                  +-------------------+
    939         |                              |                              |
    940         |                              |<--- (exchange.pub, sigᵢ) ----|
    941         |                              |                              |
    942         |                 +--------------------------+                |
    943         |                 | (M2) refund confirmation |                |
    944         |                 +--------------------------+                |
    945         |                              |                              |
    946         |<-----(value, ⟨refundᵢ⟩,------|                              |
    947         |        merchant.pub)         |                              | // todo: why merchant.pub if no sig transmitted?
    948         |                              |                              |
    949 +-----------------------+              |                              |
    950 | (W2) refund reception |              |                              |
    951 +-----------------------+              |                              |
    952         |                              |                              |
    953 ]]></artwork>
    954           <t>where (for RSA, without age-restriction)</t>
    955           <sourcecode type="pseudocode"><![CDATA[
    956 (W1) refund request (wallet)
    957 
    958 h_contract = SHA-512(canonicalJSON(contract))
    959 ]]></sourcecode>
    960           <sourcecode type="pseudocode"><![CDATA[
    961 (M1) refund processing (merchant)
    962 
    963 Check h_contract known and refund possible
    964 time = now()
    965 ⟨coinᵢ⟩ = Lookup by h_contract
    966 id = uint32(random(32))
    967 for i in 0..n:
    968   denomᵢ = Lookup by coinᵢ.h_denom
    969   valueᵢ = refund amount // todo: split wisely
    970   msgᵢ = Gen-Msg(MERCHANT_REFUND,
    971        ( h_contract | coinᵢ.pub | id | valueᵢ | denomᵢ.fee_refund ))
    972   sigᵢ = Ed25519-Sign(merchant.priv, msgᵢ)
    973 ]]></sourcecode>
    974           <sourcecode type="pseudocode"><![CDATA[
    975 (E1) refund check and confirmation (exchange)
    976 
    977 deposit_record = Lookup by h_contract // todo: needs to be persisted before with order.id and used coins!
    978 Check refund possible (prior to wire transfer deadline)
    979 for i in 0..n:
    980   Check coinᵢ.pub part of deposit_record
    981   denomᵢ = Lookup by coinᵢ.pub
    982   msgᵢ = Gen-Msg(MERCHANT_REFUND,
    983       ( h_contract | coinᵢ.pub | id | valueᵢ | denomᵢ.fee_refund ))
    984   Check Ed25519-Verify(merchant.pub, msgᵢ, sigᵢ)
    985   Check valueᵢ >= denomᵢ.fee_refund
    986   remove/update scheduled wire transfer
    987   mark coin part as unspent
    988   msgᵢ = Gen-Msg(MERCHANT_REFUND_OK, SHA-512(order.id))
    989   sigᵢ = Ed25519-Sign(exchange.priv, msgᵢ)
    990 ]]></sourcecode>
    991           <sourcecode type="pseudocode"><![CDATA[
    992 (M2) refund confirmation (merchant)
    993 
    994 for i in 0..n:
    995   msgᵢ = Gen-Msg(MERCHANT_REFUND_OK, SHA-512(order.id))
    996   Check Ed25519-Verify(exchange.pub, msgᵢ, sigᵢ)
    997   update business logic
    998   refundᵢ = (valueᵢ, sigᵢ, id, coinᵢ.pub, time)
    999 value = sum ⟨valueᵢ⟩
   1000 ]]></sourcecode>
   1001           <sourcecode type="pseudocode"><![CDATA[
   1002 (W2) refund reception (wallet)
   1003 
   1004 for i in 0..n:
   1005   (valueᵢ, sigᵢ, id, coinᵢ.pub, time) = refundᵢ
   1006 update persistent transaction information
   1007 refresh ⟨coinᵢ⟩
   1008 ]]></sourcecode>
   1009         </section>
   1010       </section>
   1011       <section anchor="obtaining-unlinkable-change">
   1012         <name>Obtaining unlinkable change</name>
   1013         <section anchor="refresh">
   1014           <name>Refresh</name>
   1015           <t>The wallet obtains <tt>n</tt> new coins <tt>⟨coinᵢ⟩</tt> of denominations <tt>⟨denomᵢ⟩</tt>
   1016 in exchange for one old <tt>coin</tt> of denomination <tt>denom</tt> from the exchange.
   1017 There are three reasons why a wallet needs to do this:</t>
   1018           <ol spacing="normal" type="1"><li>
   1019               <t>Obtaining unlinkable change after using only a part of the coin's value during a payment (cf. <xref target="payment"/>),
   1020 i.e. where <tt>contribution &lt;= denom.value</tt></t>
   1021             </li>
   1022             <li>
   1023               <t>Obtaining unlinkable change after a successful refund (cf. <xref target="refund"/>)</t>
   1024             </li>
   1025             <li>
   1026               <t>Renewing a coin before it deposit-expires</t>
   1027             </li>
   1028           </ol>
   1029           <t>The sum of the refresh fee of <tt>denom</tt> and the new denominations' values and withdrawal fees (defined by the exchange)
   1030 must be smaller or equal to the residual value of the old <tt>coin</tt>.</t>
   1031           <t>The private key of each new coin candidate <tt>⟨coinₖᵢ.priv⟩</tt> is transitively derived from the old coin's private key <tt>coin.priv</tt>
   1032 via a 512-bit secret <tt>⟨sharedₖᵢ⟩</tt> according to <tt>Refresh-Derive</tt>.
   1033 The secret is regeneratable with the knowledge of <tt>coin.priv</tt> via the link protocol (cf. <xref target="link"/>).
   1034 The derivation ensures that ownership of coins (knowledge of the private key) is correctly transferred,
   1035 and thereby that value transfer among untrusted parties can only happen via payment and deposit, not via refresh.</t>
   1036           <artwork><![CDATA[
   1037 Refresh-Derive(shared, i, denom) =
   1038   planchet_seed = HKDF(uint32(i), shared, "taler-coin-derivation", 64)
   1039   blind_secret = HKDF("bks", planchet_seed, "", 32)
   1040   coin.priv = HKDF("coin", planchet_seed, "", 32)
   1041   coin.pub = Ed25519-GetPub(coin.priv)
   1042   planchet = RSA-FDH-Blind(SHA-512(coin.pub), blind_secret, denom.pub)
   1043   h_planchet = Hash-Planchet(planchet, denom)
   1044   return (coin, blind_secret, planchet, h_planchet)
   1045 ]]></artwork>
   1046           <t>Taler uses a cut-and-choose protocol with the fixed parameter <tt>κ=3</tt> to enforce correct derivation
   1047 of <tt>⟨sharedₖᵢ⟩</tt> from a single seed per batch of planchets <tt>⟨batch_seedₖ⟩</tt>
   1048 (in (κ-1)/κ of the cases, making income concealment for tax evasion purposes unpractical).</t>
   1049           <t>Refreshing consists of two parts:</t>
   1050           <ol spacing="normal" type="1"><li>
   1051               <t>Melting of the old coin and commiting to κ batches of blinded planchet candidates</t>
   1052             </li>
   1053             <li>
   1054               <t>Revelation of κ-1 secrets <tt>⟨revealed_seedₖ⟩</tt> to prove the proper construction of the (revealed) batches of blinded planchet candidates.</t>
   1055             </li>
   1056           </ol>
   1057           <artwork><![CDATA[
   1058             wallet                                  exchange
   1059 Knows ⟨denomᵢ⟩                          Knows ⟨denomᵢ.priv⟩
   1060 Knows coin                                              |
   1061                |                                        |
   1062 +-------------------+                                   |
   1063 | (W1) coin melting |                                   |
   1064 +-------------------+                                   |
   1065                |                                        |
   1066                |---------------- /melt ---------------->|
   1067                |     (coin.{pub,sig,h_denom}, value,    |
   1068                |      refresh_seed, planchets, sig)     |
   1069                |                                        |
   1070                |                      +---------------------------------------+
   1071                |                      | (E1) gamma selection and coin signing |
   1072                |                      +---------------------------------------+
   1073                |                                        |
   1074                |<------ (ɣ, exchange.pub, sig) ---------|
   1075                |                                        |
   1076 +------------------------+                              |
   1077 | (W2) secret revelation |                              |
   1078 +------------------------+                              |
   1079                |                                        |
   1080                |------------ /reveal-melt ------------->|
   1081                |     (commitment, ⟨revealed_seedₖ⟩)     |
   1082                |                                        |
   1083                |                      +----------------------------+
   1084                |                      | (E2) commitment validation |
   1085                |                      +----------------------------+
   1086                |                                        |
   1087                |<---------- (⟨blind_sigᵢ⟩) -------------|
   1088                |                                        |
   1089 +----------------------+                                |
   1090 | (W3) coin unblinding |                                |
   1091 +----------------------+                                |
   1092                |                                        |
   1093 ]]></artwork>
   1094           <t>where (for RSA, without age-restriction)</t>
   1095           <sourcecode type="pseudocode"><![CDATA[
   1096 (W1) coin melting (wallet)
   1097 
   1098 refresh_seed = random(256)
   1099 ⟨batch_seedₖ⟩ = HKDF("refresh-batch-seeds", refresh_seed, coin.priv, k*64)
   1100 for k in 0..κ:
   1101   ⟨transferₖᵢ.priv⟩ = HKDF("refresh-transfer-private-keys", batch_seedₖ, "", n*32)
   1102   for i in 0..n:
   1103     transferₖᵢ.pub = ECDH-GetPub(transferₖᵢ.priv)
   1104     sharedₖᵢ = ECDH-Ed25519-Pub(transferₖᵢ.priv, coin.pub)
   1105     (coinₖᵢ, blind_secretₖᵢ, planchetₖᵢ, h_planchetₖᵢ) = Refresh-Derive(sharedₖᵢ, denomᵢ)
   1106   h_planchetsₖ = SHA-512( ⟨h_planchetₖᵢ⟩ )
   1107 value = coin.denom.fee_refresh + Sum ⟨denomᵢ.value⟩ + Sum ⟨denomᵢ.fee_withdraw⟩
   1108 commitment = SHA-512( refresh_seed | uint256(0x0) | coin.pub | value
   1109                     | SHA-512( ⟨h_planchetsₖ⟩ ) )
   1110 for i in 0..n:
   1111   h_denomᵢ = Hash-Denom(denomᵢ)
   1112 planchets = (⟨h_denomᵢ⟩, ⟨planchetₖᵢ⟩, ⟨transferₖᵢ.pub⟩))
   1113 msg = Gen-Msg(WALLET_COIN_MELT,
   1114     ( commitment | coin.h_denom | uint256(0x0)
   1115     | value | denom.fee_refresh ))
   1116 sig = Ed25519-Sign(coin.priv, msg)
   1117 Persist (coin.denom.pub, ...) // todo: double-check
   1118 ]]></sourcecode>
   1119           <sourcecode type="pseudocode"><![CDATA[
   1120 (E1) gamma selection and coin signing (exchange)
   1121 
   1122 denom = Lookup by coin.h_denom
   1123 Check denom known and not deposit-expired
   1124 Check RSA-FDH-Verify(SHA-512(coin.pub), coin.sig, denom.pub)
   1125 Check coin.pub known and dirty
   1126 (⟨h_denomᵢ⟩, ⟨planchetₖᵢ⟩, ⟨transferₖᵢ.pub⟩)) = planchets
   1127 for i in 0..n:
   1128   denomᵢ = Lookup by h_denomᵢ
   1129   Check denomᵢ known and not withdraw-expired
   1130 value' = coin.denom.fee_refresh + Sum ⟨denomᵢ.value⟩ + Sum ⟨denomᵢ.fee_withdraw⟩
   1131 Check value' == value
   1132 Check-Subtract(coin.value, value)
   1133 for k in 0..κ:
   1134   for i in 0..n:
   1135     h_planchetₖᵢ = Hash-Planchet(planchetₖᵢ, denomᵢ)
   1136   h_planchetsₖ = SHA-512( ⟨h_planchetₖᵢ⟩ )
   1137 commitment = SHA-512( refresh_seed | uint256(0x0) | coin.pub | value
   1138                     | SHA-512( ⟨h_planchetsₖ⟩ ) )
   1139 msg = Gen-Msg(WALLET_COIN_MELT,
   1140     ( commitment | coin.h_denom | uint256(0x0)
   1141     | value | denom.fee_refresh ))
   1142 Check Ed25519-Verify(coin.pub, msg, sig)
   1143 refresh_record = Lookup by commitment
   1144 (ɣ, _, _, done, _) = refresh_record
   1145 if refresh_record not found:
   1146   ɣ = 0..κ at random
   1147   for i in 0..n:
   1148     blind_sigᵢ = RSA-FDH-Sign(planchetᵧᵢ, denomᵧᵢ.priv)
   1149   link_info = (refresh_seed, ⟨transferₖᵢ.pub⟩, ⟨h_denomᵢ⟩, coin_sig)
   1150   Persist refresh_record = (commitment, ɣ, ⟨blind_sigᵢ⟩, h_planchetsᵧ, false, link_info)
   1151 msg = Gen-Msg(EXCHANGE_CONFIRM_MELT,
   1152     ( commitment | uint32(ɣ) ))
   1153 sig = Ed25519-Sign(exchange.priv, msg)
   1154 ]]></sourcecode>
   1155           <sourcecode type="pseudocode"><![CDATA[
   1156 (W2) secret revelation (wallet)
   1157 
   1158 Check exchange.pub known
   1159 msg = Gen-Msg(EXCHANGE_CONFIRM_MELT,
   1160     ( commitment | uint32(ɣ) ))
   1161 Check Ed25519-Verify(exchange.pub, msg, sig)
   1162 Persist refresh-challenge // what exactly?
   1163 for k in 0..κ and k != ɣ:
   1164   revealed_seedₖ = batch_seedₖ
   1165 ]]></sourcecode>
   1166           <sourcecode type="pseudocode"><![CDATA[
   1167 (E2) commitment validation (exchange)
   1168 
   1169 refresh_record = Lookup by commitment
   1170 (ɣ, ⟨blind_sigᵢ⟩, h_planchetsᵧ, done, _) = refresh_record
   1171 Check not done // todo: sure?
   1172 for k in 0..κ and k != ɣ:
   1173   ⟨transferₖᵢ.priv⟩ = HKDF("refresh-transfer-private-keys", batch_seedₖ, "", n*32)
   1174   for i in 0..n:
   1175     transferₖᵢ.pub = ECDH-GetPub(transferₖᵢ.priv)
   1176     sharedₖᵢ = ECDH-Ed25519-Pub(transferₖᵢ.priv, coin.pub)
   1177     (_, _, _, h_planchetₖᵢ) = Refresh-Derive(sharedₖᵢ, denomᵢ)
   1178   h_planchetsₖ = SHA-512( ⟨h_planchetₖᵢ⟩ )
   1179 value = coin.denom.fee_refresh + Sum ⟨denomᵢ.value⟩ + Sum ⟨denomᵢ.fee_withdraw⟩
   1180 commitment' = SHA-512( refresh_seed | uint256(0x0) | coin.pub | value
   1181                      | SHA-512( ⟨h_planchetsₖ⟩ ) )
   1182 Check commitment == commitment'
   1183 Persist refresh_record = (_, _, _, true, _)
   1184 ]]></sourcecode>
   1185           <sourcecode type="pseudocode"><![CDATA[
   1186 (W3) coin unblinding (wallet)
   1187 
   1188 for i in 0..n:
   1189   coinᵧᵢ.sig = RSA-FDH-Unblind(blind_sigᵧᵢ, blind_secretᵧᵢ, denomᵢ.pub)
   1190   Check RSA-FDH-Verify(SHA-512(coinᵧᵢ.pub), coinᵧᵢ.sig, denomᵢ.pub)
   1191   coinᵧᵢ.h_denom = h_denomᵢ
   1192   Persist ⟨coinᵧᵢ⟩
   1193 ]]></sourcecode>
   1194         </section>
   1195         <section anchor="link">
   1196           <name>Link</name>
   1197           <t>Coins ⟨coinᵧᵢ⟩ obtained via the refresh protocol (cf. <xref target="refresh"/>) can be regenerated
   1198 with the knowledge of the old coin's private key <tt>coin.priv</tt> using the link protocol,
   1199 integrated in the coin history endpoint.</t>
   1200           <artwork><![CDATA[
   1201             wallet                                  exchange
   1202 Knows coin                              Knows refresh_record for coin.pub
   1203                |                                        |
   1204 +----------------------+                                |
   1205 | (W1) history request |                                |
   1206 +----------------------+                                |
   1207                |                                        |
   1208                |------ /coins/{coin.pub}/history ------>|
   1209                |                 (sig)                  |
   1210                |                                        |
   1211                |                      +----------------------------+
   1212                |                      | (E1) refresh secret lookup |
   1213                |                      +----------------------------+
   1214                |                                        |
   1215                |<------------- (melt_info) -------------|
   1216                |                                        |
   1217 +-----------------------+                               |
   1218 | (W2) coin acquisition |                               |
   1219 +-----------------------+                               |
   1220                |                                        |
   1221 ]]></artwork>
   1222           <t>where (for RSA, without age-restriction)</t>
   1223           <sourcecode type="pseudocode"><![CDATA[
   1224 (W1) history request (wallet)
   1225 
   1226 msg = Gen-Msg(COIN_HISTORY_REQUEST, uint64(0x0))
   1227 sig = Ed25519-Sign(coin.priv, msg)
   1228 ]]></sourcecode>
   1229           <sourcecode type="pseudocode"><![CDATA[
   1230 (E1) refresh secret lookup (exchange)
   1231 
   1232 refresh_record = Lookup by coin.pub
   1233 (ɣ, ⟨blind_sigᵢ⟩, _, done, link_info) = refresh_record
   1234 if done:
   1235   melt_info = (ɣ, link_info, ⟨blind_sigᵢ⟩)
   1236 else:
   1237   melt_info = (ɣ, link_info)
   1238 ]]></sourcecode>
   1239           <sourcecode type="pseudocode"><![CDATA[
   1240 (W2) coin acquisition (wallet)
   1241 
   1242 (ɣ, link_info, ⟨blind_sigᵢ⟩?) = melt_info
   1243 (refresh_seed, ⟨transferₖᵢ.pub⟩, ⟨h_denomᵢ⟩, coin_sig) = link_info
   1244 
   1245 for i in 0..n:
   1246   denomᵢ = Lookup by h_denomᵢ
   1247 for k in 0..κ:
   1248   for i in 0..n:
   1249     sharedₖᵢ = ECDH-Ed25519-Priv(coin.priv, transferₖᵢ.pub)
   1250     (coinₖᵢ, blind_secretₖᵢ _, h_planchetₖᵢ) = Refresh-Derive(sharedₖᵢ, denomᵢ)
   1251   h_planchetsₖ = SHA-512( ⟨h_planchetₖᵢ⟩ )
   1252 value = coin.denom.fee_refresh + Sum ⟨denomᵢ.value⟩ + Sum ⟨denomᵢ.fee_withdraw⟩
   1253 commitment = SHA-512( refresh_seed | uint256(0x0) | coin.pub | value
   1254                     | SHA-512( ⟨h_planchetsₖ⟩ ) )
   1255 msg = Gen-Msg(WALLET_COIN_MELT,
   1256     ( commitment | coin.h_denom | uint256(0x0)
   1257     | value | denom.fee_refresh ))
   1258 Check Ed25519-Verify(coin.pub, msg, sig)
   1259 
   1260 if ⟨blind_sigᵢ⟩ returned:
   1261   for i in 0..n:
   1262     coinᵧᵢ.sig = RSA-FDH-Unblind(blind_sigᵧᵢ, blind_secretᵧᵢ, denomᵢ.pub)
   1263     Check RSA-FDH-Verify(SHA-512(coinᵧᵢ.pub), coinᵧᵢ.sig, denomᵢ.pub)
   1264     coinᵧᵢ.h_denom = h_denomᵢ
   1265   Persist ⟨coinᵧᵢ⟩
   1266 ]]></sourcecode>
   1267         </section>
   1268         <section anchor="refresh-recoup">
   1269           <name>Recoup</name>
   1270           <t>// todo</t>
   1271         </section>
   1272       </section>
   1273       <section anchor="w2w">
   1274         <name>Transfer of E-Cash</name>
   1275         <t>// todo: introductory text</t>
   1276         <t>Transactions in E-Cash between wallets.
   1277 Commonly referred to as peer-to-peer transactions.
   1278 In Taler, interaction with exchange, therefore called wallet-to-wallet transactions.</t>
   1279         <section anchor="w2w-account">
   1280           <name>Account Creation</name>
   1281         </section>
   1282         <section anchor="w2w-push">
   1283           <name>Push Payment</name>
   1284           <t>// todo</t>
   1285         </section>
   1286         <section anchor="w2w-pull">
   1287           <name>Pull Payment</name>
   1288           <t>// todo</t>
   1289         </section>
   1290       </section>
   1291     </section>
   1292     <section anchor="security-considerations">
   1293       <name>Security Considerations</name>
   1294       <t>[ TBD ]</t>
   1295     </section>
   1296     <section anchor="iana-considerations">
   1297       <name>IANA Considerations</name>
   1298       <t>None.</t>
   1299     </section>
   1300   </middle>
   1301   <back>
   1302     <references anchor="sec-normative-references">
   1303       <name>Normative References</name>
   1304       <reference anchor="RFC20">
   1305         <front>
   1306           <title>ASCII format for network interchange</title>
   1307           <author fullname="V.G. Cerf" initials="V.G." surname="Cerf"/>
   1308           <date month="October" year="1969"/>
   1309         </front>
   1310         <seriesInfo name="STD" value="80"/>
   1311         <seriesInfo name="RFC" value="20"/>
   1312         <seriesInfo name="DOI" value="10.17487/RFC0020"/>
   1313       </reference>
   1314       <reference anchor="RFC2104">
   1315         <front>
   1316           <title>HMAC: Keyed-Hashing for Message Authentication</title>
   1317           <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
   1318           <author fullname="M. Bellare" initials="M." surname="Bellare"/>
   1319           <author fullname="R. Canetti" initials="R." surname="Canetti"/>
   1320           <date month="February" year="1997"/>
   1321           <abstract>
   1322             <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key. The cryptographic strength of HMAC depends on the properties of the underlying hash function. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind</t>
   1323           </abstract>
   1324         </front>
   1325         <seriesInfo name="RFC" value="2104"/>
   1326         <seriesInfo name="DOI" value="10.17487/RFC2104"/>
   1327       </reference>
   1328       <reference anchor="RFC5869">
   1329         <front>
   1330           <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
   1331           <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
   1332           <author fullname="P. Eronen" initials="P." surname="Eronen"/>
   1333           <date month="May" year="2010"/>
   1334           <abstract>
   1335             <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
   1336           </abstract>
   1337         </front>
   1338         <seriesInfo name="RFC" value="5869"/>
   1339         <seriesInfo name="DOI" value="10.17487/RFC5869"/>
   1340       </reference>
   1341       <reference anchor="RFC6234">
   1342         <front>
   1343           <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
   1344           <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
   1345           <author fullname="T. Hansen" initials="T." surname="Hansen"/>
   1346           <date month="May" year="2011"/>
   1347           <abstract>
   1348             <t>Federal Information Processing Standard, FIPS</t>
   1349           </abstract>
   1350         </front>
   1351         <seriesInfo name="RFC" value="6234"/>
   1352         <seriesInfo name="DOI" value="10.17487/RFC6234"/>
   1353       </reference>
   1354       <reference anchor="RFC7748">
   1355         <front>
   1356           <title>Elliptic Curves for Security</title>
   1357           <author fullname="A. Langley" initials="A." surname="Langley"/>
   1358           <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
   1359           <author fullname="S. Turner" initials="S." surname="Turner"/>
   1360           <date month="January" year="2016"/>
   1361           <abstract>
   1362             <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
   1363           </abstract>
   1364         </front>
   1365         <seriesInfo name="RFC" value="7748"/>
   1366         <seriesInfo name="DOI" value="10.17487/RFC7748"/>
   1367       </reference>
   1368       <reference anchor="RFC8032">
   1369         <front>
   1370           <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
   1371           <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
   1372           <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
   1373           <date month="January" year="2017"/>
   1374           <abstract>
   1375             <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
   1376           </abstract>
   1377         </front>
   1378         <seriesInfo name="RFC" value="8032"/>
   1379         <seriesInfo name="DOI" value="10.17487/RFC8032"/>
   1380       </reference>
   1381       <reference anchor="HKDF">
   1382         <front>
   1383           <title>Cryptographic Extraction and Key Derivation: The HKDF Scheme</title>
   1384           <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
   1385             <organization/>
   1386           </author>
   1387           <date year="2010"/>
   1388         </front>
   1389         <seriesInfo name="Lecture Notes in Computer Science" value="pp. 631-648"/>
   1390         <seriesInfo name="DOI" value="10.1007/978-3-642-14623-7_34"/>
   1391         <seriesInfo name="ISBN" value="[&quot;9783642146220&quot;, &quot;9783642146237&quot;]"/>
   1392         <refcontent>Springer Berlin Heidelberg</refcontent>
   1393       </reference>
   1394       <reference anchor="SHS">
   1395         <front>
   1396           <title>Secure hash standard</title>
   1397           <author>
   1398             <organization/>
   1399           </author>
   1400           <date year="2015"/>
   1401         </front>
   1402         <seriesInfo name="DOI" value="10.6028/nist.fips.180-4"/>
   1403         <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
   1404       </reference>
   1405     </references>
   1406     <?line 1444?>
   1407 
   1408 <section anchor="test-vectors">
   1409       <name>Test Vectors</name>
   1410       <t>This appendix provides two sets of test vectors for testing Taler Protocol implementations.
   1411 They are generated by going through the protocol operations in the following order:</t>
   1412       <ol spacing="normal" type="1"><li>
   1413           <t>Withdraw two coins <tt>coin₀</tt> and <tt>coin₁</tt> from a single <tt>reserve</tt> (cf. <xref target="withdraw"/>).</t>
   1414         </li>
   1415         <li>
   1416           <t>Pay for one <tt>order</tt> with the full value of <tt>coin₀</tt> and a partial value of <tt>coin₁</tt> (cf. <xref target="payment"/>).</t>
   1417         </li>
   1418         <li>
   1419           <t>Obtain a partial refund on <tt>coin₀</tt> used to pay for the <tt>order</tt> (cf. <xref target="refund"/>).</t>
   1420         </li>
   1421         <li>
   1422           <t>Refresh the now-dirty <tt>coin₁</tt> to two new coins <tt>coin₂</tt> and <tt>coin₃</tt> (cf. <xref target="refresh"/>).</t>
   1423         </li>
   1424         <li>
   1425           <t>Regenerate <tt>coin₂</tt> and <tt>coin₃</tt> with the knowledge of <tt>coin₁</tt> (cf. <xref target="link"/>).</t>
   1426         </li>
   1427         <li>
   1428           <t>Create an <tt>account</tt> for w2w transfers (cf. <xref target="w2w-account"/>).</t>
   1429         </li>
   1430         <li>
   1431           <t>Send a payment to <tt>account</tt> with the full value of <tt>coin₂</tt>, obtaining <tt>coin₄</tt> (cf. <xref target="w2w-push"/>).</t>
   1432         </li>
   1433         <li>
   1434           <t>Request a payment to <tt>account</tt>, which is paid with the full value of <tt>coin₄</tt>, obtaining <tt>coin₅</tt> (cf. <xref target="w2w-pull"/>).</t>
   1435         </li>
   1436         <li>
   1437           <t>Recoup the value of <tt>coin₅</tt> obtained via withdrawal from <tt>account</tt> (cf. <xref target="withdraw-recoup"/>).</t>
   1438         </li>
   1439         <li>
   1440           <t>Recoup the value of <tt>coin₃</tt> obtained via refresh from <tt>coin₁</tt> (cf. <xref target="refresh-recoup"/>).</t>
   1441         </li>
   1442       </ol>
   1443       <t>// todo: p2p sending full coins only works without fees, should we set fees to zero?</t>
   1444       <t>// todo: refund would be slightly more interesting with 2 coins being (partially) refunded,
   1445 should we change to full refund coin0 + partial refund coin1 (coin1 value after fee_deposit + fee_refund should then match denom2 + denom3)</t>
   1446       <t>The test vectors in this document have been generated by the GNU Taler reference implementation written in C.
   1447 All binary data is provided in hexadecimal notation.
   1448 Big numbers for RSA are represented in big-endian byte order (most significant byte first).</t>
   1449       <section anchor="test-case-1">
   1450         <name>Test Case 1</name>
   1451         <sourcecode type="pseudocode"><![CDATA[
   1452 exchange.master_pub  = 3cb5e9823db2b335fdb3f284ae960e56be8b081c6819b8
   1453                        b0217f38b095b4313b
   1454 exchange.priv        = 1bf4149fa644b3c7f2bf02da4703ff2de3fa160dce0c75
   1455                        0eabfa0f7ac70a2442
   1456 exchange.pub         = 4c130aae3246831808a162e2d4330de394e5f0d7dff75a
   1457                        80f3fa045b1a43eabb
   1458 exchange.url         = https://exchange.taler.example.org/
   1459 denom₀.pub.n         = ba42b9e75e48847bab175ed4797384d68a430fd849a914
   1460                        aa68438349743b2728d9ca97709c15d5c81c7d9d11c84e
   1461                        c9c60cec03aed4b36ad153768eb30cf9845474e97ee9d7
   1462                        475ebc926d87135d56926b7df1cea3ec38897a74bc3e24
   1463                        5e59ffa76e5aff2c2f2eb84e7133a879f4229221f91c7b
   1464                        ddf96088e4020e16444d94acc30708069f4a1bde3dcbea
   1465                        d32e3916a9f6722adb3d63bb9075dde49258fbd28a9a09
   1466                        251fa08b64faee53a506b9f637136c72af7382b9243fa8
   1467                        996ad4d72cc1b05cfb45271cb3187b4eeec0b5f9e847cd
   1468                        cc0c3ddef9787164a1aee7e4e1ee6de1b95282c1ff646a
   1469                        a70aabd1df0003f75d3585e9e740916cee4f7bca0cd82f
   1470                        72104d
   1471 denom₀.pub.e         = 010001
   1472 denom₀.priv.d        = 07bc432fbc6eeb0f9ec2a4f5d2886d65228f57ee5ddac7
   1473                        88af355493bd9fc247d449b161e41d95080f44d93bd693
   1474                        8d162c4db5f6720f7479768ba73000f330df780e856e8d
   1475                        3a01d1778c546e85b3157820de24bc9290238782271a36
   1476                        94f38c6645f3420331ff70f8930377f4fea25beaccc775
   1477                        ce796f9ca7c97d0fc82ce7a6880dd437e6b30695ca51a5
   1478                        8f0239aef7481932550ce61b5b085313cb888c893cc1bb
   1479                        ef6b47c607e1189f8cccb04eeb9f87b9e53f414850f8b9
   1480                        23ce83e2859c0434a3d14d861e864fd5ce701af1161139
   1481                        8a73515b7056b2828e564cdec6052bdbb43ff435178577
   1482                        198de0676e5d378ade9b31844e81e2218ba3b3aec5bff9
   1483                        a26621
   1484 denom₀.hash          = 8653090e3f3f5efac9770a5dd0c97813940c191c9fa171
   1485                        3367f8bb1279b1e3d27f32d16ea7699501e5fc4d176725
   1486                        d76ab0307f9bdf9d0d263c2256a7f1c63143
   1487 denom₀.value         = KUDOS:5.12
   1488 denom₀.fee_withdraw  = KUDOS:0.01
   1489 denom₀.fee_deposit   = KUDOS:0.01
   1490 denom₀.fee_refresh   = KUDOS:0.01
   1491 denom₀.fee_refund    = KUDOS:0.01
   1492 denom₁.pub.n         = d5455fb79449df7bf548e384d5201d75f4f7697ef9b805
   1493                        1eb8536f66783e70ca2d524fefa6840c1f87d9d8814868
   1494                        15d5ace866a32269b05bdba7ff6024811c19456026b0a5
   1495                        9da4db96f58729d286c90be8cd9cbf575d346202b43282
   1496                        d601b5751ff77a88a0742a692349a0e3fa8ed5518fc537
   1497                        8fcf434929b541c942573abef310b87776e976e81cf650
   1498                        a04399fabddbde677163918250c4d45f5e90ee7539de50
   1499                        0a8e915be1d5f17d79cb9585ccdf5dba42ef53c24eae7d
   1500                        7c93c4e0a432788245b7c76a587f0ac6889d3038953136
   1501                        2d51c2ad65cb1e28b4ad4cc97fcd2a4aedd6612ae8888e
   1502                        b2dbc4de0cf30f46a43b76cc8c3245eefe013195a237f0
   1503                        2d13b5
   1504 denom₁.pub.e         = 010001
   1505 denom₁.priv.d        = 5a520e0e663bbeecf55d5015d258ce8145247ec62aa5d7
   1506                        6d422cfbb1cedccad1a4ce06527d17d1368d47221ce678
   1507                        463eff02516d6746914ce5c2c9318364366d31675e1b53
   1508                        9866d8249f89059a4640e0cd503ec0fe13d7fa6620c07f
   1509                        8e789ccba4a51f7cbb4f5722bdb211f45b09a0a7f11659
   1510                        c88ac37939b3accfba4bccf24ea260e21aaec0dfbf8571
   1511                        78438986e963e9e356277c3badc34fc91b705d9956b4be
   1512                        dc0947d65924d7dd31e564de798eb06837380caed6813d
   1513                        3761d119901c5540eb74c3cb674fdfd64b67d78ebd40de
   1514                        0cafd53c038a0a8e87890b953b8b94a9771a6efb3142ca
   1515                        02db873053f8d1de2082db4366fc072aafc723c036a2fb
   1516                        999605
   1517 denom₁.hash          = 1de6052bce12feaa2d26e3bba1789b0c2295028279f3ea
   1518                        ff8e1345448ba05390cff49656ed72a1f7ef6ee2c4a80f
   1519                        80eefa0d0f906e74305b0215c4194ab1c7b8
   1520 denom₁.value         = KUDOS:2.56
   1521 denom₁.fee_withdraw  = KUDOS:0.01
   1522 denom₁.fee_deposit   = KUDOS:0.01
   1523 denom₁.fee_refresh   = KUDOS:0.01
   1524 denom₁.fee_refund    = KUDOS:0.01
   1525 denom₂.pub.n         = d1320993658042f995f09ed66ad2283e457a1f44cad96f
   1526                        1cf5a6299ac93d61724a7448d70e56a38666ec66352a58
   1527                        10ca3e544d957dedb5789e135589fcb8b139c65a2f70d7
   1528                        c421dfd4e27cf38d463074d286730be23d446fc0781151
   1529                        9b068346b28b86b94acff35524eb62436852714c92f03b
   1530                        0bac21bb6bf727734be7871b702f928c3ced4bad9ba2d4
   1531                        9cec6a86d1019181c65c16abf7b391f103c90c3eaaaa9d
   1532                        5298a4a60c71bdaf0f08246327a62399bf4c424c1ed771
   1533                        8cb5df178daa9710ec9d098e99ed0456de2fbaf7865ba4
   1534                        7931c52d1cac78cacc1bc451782587487a6189addfe5dc
   1535                        df6f190f28816707e3d1e104b5a1f7a570b75c1951588f
   1536                        3289ef
   1537 denom₂.pub.e         = 010001
   1538 denom₂.priv.d        = 311849a8066faa083218b4e6444e8af44650e94ab7427d
   1539                        31b232eb5bb0b3cf8d478cefd54cbfa783f0deb503f02a
   1540                        97d226fb98f3a708a508a82c886c285bddf7dda5a7b197
   1541                        69a7bb84961cd5f9c749b2f8ff65bb99be6033cbdb41d1
   1542                        418d2f3ce5c519fa9d649d4a53ae4c32dea64e81b6905b
   1543                        831b44155cbab5cef8b6defde09295662cdf2189f2763e
   1544                        de05bea0acb707b9b6b087dcebb9ca81f1c2785d6560f9
   1545                        3bf1a1860676cccceb079c22b48b9fdef68e1d286164f1
   1546                        32ffddeab29fa7a704e1bc3f9f5e28c39675f17136aed8
   1547                        542aa4470a14a7380a4016b21d43ef5b9e2b241ced017c
   1548                        54247c12fd6beccb7bd356820b0246553c751b3e071468
   1549                        c2efdd
   1550 denom₂.hash          = 4f8c487d21ffb5bb7571f5d66bcf6f93f4f5c043df5483
   1551                        669383128700064e8637afecd6029cb36dfc5a60d20ff3
   1552                        112ff1b5ad1b53c78cf39ad13cd2531ba24e
   1553 denom₂.value         = KUDOS:0.16
   1554 denom₂.fee_withdraw  = KUDOS:0.01
   1555 denom₂.fee_deposit   = KUDOS:0.01
   1556 denom₂.fee_refresh   = KUDOS:0.01
   1557 denom₂.fee_refund    = KUDOS:0.01
   1558 denom₃.pub.n         = bddb1806b7b7663d94bedbeccbb515987fcae457b5920d
   1559                        85b8485edac6ab0e73e6991780e9f1fa6f88e500e0ccd9
   1560                        eeb80d8e3b66289a7cf1b25bd56d05081d583864ad225a
   1561                        36f8d38391782a85bfe320d439443e8ea19f555edb36fc
   1562                        b58af81ca5168ca7c42dda68f191bd1587b4da27703384
   1563                        f2aad300a043549c67fc6defd98bd1074b3bab1bc0d89b
   1564                        87d81f8a1f555a3b4ce2b4ca7b0b1d8f446fa93258db51
   1565                        1cc3bc2ff62871cb4c746f6806d0b839db8cc560da06eb
   1566                        5619d9d42309a77161373708db18e453ff0a1d6f63281c
   1567                        54ffacada7c8bf5ca7281ffe7e2e5be03fc006c064d820
   1568                        f719e672429628837399a565dd9d70f6e9ed91e1eb0567
   1569                        978015
   1570 denom₃.pub.e         = 010001
   1571 denom₃.priv.d        = 1e3370867d0a0d1705b18e0d848d73f7d422f920e4aec2
   1572                        3cea7184b9463a26c1e9704d4cacaa5952b8683eb403e7
   1573                        8a5c628cfa1b9da0e44d9462f1b7f66c1c883b419f484e
   1574                        d3de257e113c1828e4e5e3592f1a3bddf78d7f88927ee9
   1575                        9892c3362ca2c226dbd90971d68a54404d069d5f5704b3
   1576                        04e131fb3058959338781a203993804f64def2980210dc
   1577                        3f4e77c1207400e922032952cb154bb1b776d164cce69e
   1578                        418844f2f4b20850c0a23d30059362edadfe00fbfa04b6
   1579                        833fc4606deda441eb345c49b52d91063da7c55ecea7b3
   1580                        2e99a49a823264955803ce3ee220a2cc64cd4321e18ae2
   1581                        8bb1071c7746e8a3d69adef5113e21a01cab6809668793
   1582                        c2a94f
   1583 denom₃.hash          = 96524d30b4398d0d5bbe2eff902c4df1cc8286629d149b
   1584                        ee0530edcfb361c468ea5fdb1b41d538223c8b3fe1a974
   1585                        951bb3290bbfffc6f10cbf0326585041ca4d
   1586 denom₃.value         = KUDOS:0.08
   1587 denom₃.fee_withdraw  = KUDOS:0.01
   1588 denom₃.fee_deposit   = KUDOS:0.01
   1589 denom₃.fee_refresh   = KUDOS:0.01
   1590 denom₃.fee_refund    = KUDOS:0.01
   1591 merchant.priv        = 7607240acc4563ebe2e38e76eaf61d74160d71c9a6670a
   1592                        e2e5147ce848767037
   1593 merchant.pub         = f54d646619723f7fa2ce79267953fdd8654cfcd0f2cfc0
   1594                        c5e880e3e0d0ab19f0
   1595 merchant.url         = https://merchant.taler.example.org/
   1596 merchant.payto       = payto://x-taler-bank/bank.taler.example.org/merchant
   1597 ]]></sourcecode>
   1598         <section anchor="tc1-withdraw">
   1599           <name>Withdrawal</name>
   1600           <sourcecode type="pseudocode"><![CDATA[
   1601 (W1) reserve key generation (wallet)
   1602 
   1603 reserve.priv         = d9641dab5c7f2474573871c25cae2f6c8924ace4157a56
   1604                        d128b1432e55a6c6ba
   1605 reserve.pub          = ec8ad5e4c6abcf4d0d597f0066a0e3ea0370d221973e06
   1606                        e73f4287148cb93c38
   1607 ]]></sourcecode>
   1608           <sourcecode type="pseudocode"><![CDATA[
   1609 (W2) coin generation and blinding (wallet)
   1610 
   1611 batch_seed           = 466431296486ed9cd71fc207254820a2c4a85aeb0b2041
   1612                        494f8bf1f8cd30f113
   1613 coin_seed₀           = 88899daa409b8c4c4a91c8e39030d247d00b292eff952e
   1614                        36067fbe33f2d7ce48
   1615 coin_seed₁           = f5be0b8790719072c7043c257f2c114cd8cb45ea5d98c4
   1616                        aa25d9025f45f1caeb
   1617 blind_secret₀        = a3cbe2b0babf5bdfb98f45804acf63225c16e09be1677f
   1618                        705393df3f5de98ebf
   1619 blind_secret₁        = 8ea6335ed3ff8a41f9fae95e9fd87382be402d6c26ef97
   1620                        2381dee6b3c1e9d775
   1621 coin₀.priv           = a5a38bb23a9f36564f9d4e566cdd7e3521b04f8ea4175d
   1622                        a726ac4e3ac540b485
   1623 coin₁.priv           = ae98c5207fe31e20a7b7a8677b780c6735ce69df32d308
   1624                        5d504010f23c59064a
   1625 coin₀.pub            = afbdf99f1a794add25bad59c9a3f442714e166adc99c57
   1626                        db991947669a36b185
   1627 coin₁.pub            = aa7118596b1adf89543e9afcf2925e516a782eed9d75c8
   1628                        abc4a470e7efdd7fe4
   1629 planchet₀            = 64ede0cf40a952b95af4b09b22c6fd27a1ff6d0ae3920e
   1630                        a03fe14a8b547f1e14a2eea98443e7aa092075f6585103
   1631                        fb06c1d68fb4616bf33ae30a207e51840f1ae655a73418
   1632                        4a73d804df42650ce296954c9b61e249486468f7fda8a7
   1633                        4f85ec6ccdb34a66819fbeaf846b10087ffaf8e734428a
   1634                        907b96c6a112f8f943b3a8d55455c01b0daf55456acf07
   1635                        15874ff90fba45b265e2021a70997100fb18bfbef822c8
   1636                        475820b4855f141730751bcfad2e7eb46dd6c6a400a8a6
   1637                        a98486c4a2bce4d3407a0d0ba612faebb49428ba3a1986
   1638                        eddadb04b6790fbb7bd27cc0bd98341c60ec5b98027520
   1639                        2aedd4b0cf3b7ee1732c67c84db4b30b60b551cbf84922
   1640                        2c60e1
   1641 planchet₁            = 41f8a6622c99b6a9c30d52d19fc2c20a39a481219de4b0
   1642                        f3e7f604efed5d962554ea13255785d10a037e14abd75d
   1643                        80a0aa9861df9d80a051c418ff197e68bd0eee61e6fd5d
   1644                        3214633734659e8bbd7dd2fe566bd41c537a5759bad9bb
   1645                        ca6b2eb7e3217e7d3cbefff192d83bd0527dbe0eff56df
   1646                        0b2e2062670d2873ca7766a7c1255e6fcf2c37e95de19f
   1647                        cad244f3986bab45c0a3aca726fc682455ea1166a23891
   1648                        52d7a67d181f035de6bdb97633888f0594c2f63dd39651
   1649                        34372507faf84f753759abd662d4c7e8df7e01149ff44d
   1650                        a3499ed49406d9398e86c4abf12a1f57f38002115ef728
   1651                        3e4d5422b41c752a0cce8c2c1a9b84e109b4554fc1150e
   1652                        f578b9
   1653 h_planchet₀          = 888da42dbf4897a5d6d9420b827e340c74c0b0e973e140
   1654                        ad1c7b9abfc400a9ec5a86b3185e4c656dbe8e01125604
   1655                        616de83fa28910fae513d016f56c3ca94eb4
   1656 h_planchet₁          = f20015bbe0147313e59f9e64ee9e836c192b5d504dbd33
   1657                        28fcfce41fbe9310d6aa96d91fdd77599c122cc5390ad7
   1658                        cb86d2c6d4261bd5950e7ec0f86959613841
   1659 sig                  = 2ae0027dd4a196c4741d60e3e7ff933d7374fa5534d15f
   1660                        1cc2e96e9ab3392894c65ab6a0af31ccdb395db5c52677
   1661                        0077642502e27d4619d385a91dd13854e706
   1662 ]]></sourcecode>
   1663           <sourcecode type="pseudocode"><![CDATA[
   1664 (E1) coin issuance and signing (exchange)
   1665 
   1666 total                = KUDOS:7.7
   1667 blind_sig₀           = 139af4e7e7f6e9e0391e22f78cb0b2c334e6d6667633a1
   1668                        92f56fde38ac9feec7841be59b2aa993084c50f70dfd96
   1669                        73dc723eec9d84c28ebd5f8104d1b0b29cf118cd64cbe3
   1670                        3925524a3363a1a6f24f59d47a404cf74680eee97cdeb8
   1671                        cc44a0b84f3db4496d9bed1224c0fbda64d40f84ef5447
   1672                        d764fb714ca8e72a23a882e749e47a519310f6d87b3e8d
   1673                        dc3e4ac4e541cdbfe7550c92f41c511b544d9fbdc2a729
   1674                        6b958e9df0b1394210aef4f1a780a129883d4bcb45425e
   1675                        ef96204a7eaa9daa7d21827ecbf4571cefe6dbe65314e6
   1676                        1c688175c1e81e01d4f0377c9c2312b6cc3487f2dd2cf8
   1677                        d85efde346f4d1a12de70bec4038b0bea0c505087c0e67
   1678                        ce4694
   1679 blind_sig₁           = 89649cf83e2ba2cd75c7a1d01809c33d5d02fec8164925
   1680                        6215f13a8965ad37d8d47c264668ec187e46d75210ce60
   1681                        1362fbb15f61a24ec1d337dd2589b5a4ee0e77a8d9734a
   1682                        ca6a149b9f9b3a78c158b1f8cb243b8cbe9c2212290e8b
   1683                        c731d02382463f3e1cf0fc86c5472b8c96c5eaeac9c906
   1684                        4fdf7411f97935f27fd0bf88200440c7cc3e6960c5c515
   1685                        6aedb5a820077be08f1ac4b00780258d7b843b21d7baf2
   1686                        d969d1b3c77a08b4fe14b216fe78c7e4c0ae964fc06bf3
   1687                        dfe7ff20ec85fa4d5e5aec24d89848645ffadb0de3da80
   1688                        c6e41b96571ef28e3d132b7c3fd16a289e32389cffb653
   1689                        b4744fabf882342f0db9aef110351d8ffd7a3b86701f0f
   1690                        5034c8
   1691 ]]></sourcecode>
   1692           <sourcecode type="pseudocode"><![CDATA[
   1693 (W3) coin unblinding (wallet)
   1694 
   1695 coin₀.sig            = 9303650b8896b6619ca061f4bf44c1b02fb60784a2659d
   1696                        e7512b599e7e6524ad5a283c81d289d3ec75fc81e7f336
   1697                        bd41dd67a41b72a98d9171f0461c188535b555019079a1
   1698                        8b4491903797f62a034e5f277ce8f7f3f56fbe47e44113
   1699                        561fd414c841c2da97da1ae92df0e2cfbe3c26ad37f8ba
   1700                        b9bd71365ac536204cda7c21dc39891b5cbb4e213f75d4
   1701                        e09c248a7a59f6322fd011619b29ec25ad621dfa2d6fae
   1702                        9f8b91935caf54d0d30f4a03bf6beed6637a4054efbad7
   1703                        a41f9da434f07cfd2f7619e8a3c82b30e079ff9fe13fc0
   1704                        23fba7d627f4fb21e14467ce1db27767831eb1c3ad5c39
   1705                        f61437a0a70c300fd84cd9280474bb507768a868ea92fa
   1706                        905428
   1707 coin₁.sig            = 355aa5b6bf10591375f22a014640cd242f470834759fab
   1708                        4421b4d237a149bc3e5fbc8f073e1348da770983cd36df
   1709                        9cf72a30bfe55776744b2d787acb06ba25ccdef36e5269
   1710                        771fe4a38a1109e8b96437a3cc625003f7fdf4d0cc8793
   1711                        35584c5b13f2b29be1ea4d8a2da7826d608179d98b5edb
   1712                        11261e2048fbbba217a52ae862d1e78e30c0787ee40908
   1713                        f1bca708c434d5412a262eca6bcd0ac5890bfbbe7df6d6
   1714                        9a5544d0054716dfda47791546c177223606c0645858a1
   1715                        5b36887619a9d70a515f42897758bbe181765d7184cc92
   1716                        b5e2d743df1db9b30394b697117ad24811812febe0a3c5
   1717                        7cbb5cf7f6857378f57cd1149f745ed95fd1d342e9860f
   1718                        516469
   1719 ]]></sourcecode>
   1720         </section>
   1721         <section anchor="tc1-payment">
   1722           <name>Payment and Deposit</name>
   1723           <sourcecode type="pseudocode"><![CDATA[
   1724 (M1) order generation (merchant)
   1725 
   1726 wire_salt            = 4c5249caea865380e0e519fc38177686
   1727 order.id             = ORDER-40
   1728 order.price          = KUDOS:7.42
   1729 ]]></sourcecode>
   1730           <sourcecode type="pseudocode"><![CDATA[
   1731 (W1) nonce generation (wallet)
   1732 
   1733 nonce.pub            = 6729d69abd7d8218e02c953317b46bba2522efc2c19a7d
   1734                        a63194e9ef40fcbd0d
   1735 ]]></sourcecode>
   1736           <sourcecode type="pseudocode"><![CDATA[
   1737 (M2) contract generation (merchant)
   1738 
   1739 h_wire               = ec4e7258747a4de49628a27907b74f0aad097cfafaa595
   1740                        320f81786375430b67ae1ada754299bbc0472f5a1e8bae
   1741                        6fe8e5dc52683dd09490ff06fb2fa4f20ec2
   1742 timestamp            = Sat Feb 14 13:37:42 2026
   1743 pay_deadline         = Sat Feb 14 14:07:42 2026
   1744 refund_deadline      = Sun Feb 15 13:37:42 2026
   1745 wire_deadline        = Mon Feb 16 13:37:42 2026
   1746 contract             = {
   1747   "version": 0,
   1748   "summary": "Free Software Support",
   1749   "order_id": "ORDER-40",
   1750   "products": [],
   1751   "timestamp": {
   1752     "t_s": 1771076262
   1753   },
   1754   "refund_deadline": {
   1755     "t_s": 1771162662
   1756   },
   1757   "pay_deadline": {
   1758     "t_s": 1771078062
   1759   },
   1760   "wire_transfer_deadline": {
   1761     "t_s": 1771249062
   1762   },
   1763   "merchant_pub": "YN6P8SGSE8ZQZ8PEF4K7JMZXV1JMSZ6GYB7W1HF8G3HY1M5B37R0",
   1764   "merchant_base_url": "https://merchant.taler.example.org/",
   1765   "merchant": {
   1766     "name": "Taler Merchant"
   1767   },
   1768   "h_wire": "XH774P3MF96Y95H8M9WGFDTF1APGJZ7TZAJSACGFG5W66XA31DKTW6PTEN19KEY08WQNM7MBNSQYHSEWA9M3VM4MJ3ZGDYSFMKS0XGG",
   1769   "wire_method": "XXXX",
   1770   "exchanges": [
   1771     {
   1772       "url": "https://exchange.taler.example.org/",
   1773       "priority": 1024,
   1774       "master_pub": "7JTYK0HXPASKBZDKYA2AX5GEATZ8P20WD0CVHC11FWWB15DM64XG"
   1775     }
   1776   ],
   1777   "nonce": "CWMXD6NXFP11HR1CJMSHFD3BQ8JJ5VY2R6D7V9HHJKMYYG7WQM6G",
   1778   "amount": "KUDOS:7.42",
   1779   "max_fee": "KUDOS:0.01"
   1780 }
   1781 h_contract           = cc934a29efa612754edba0453d1b0ba175d6830d3ec2b2
   1782                        839a9a539d845a5da4622498e3819cb49206810688a93d
   1783                        e1989c6542d2cf1d71f64dc998193e76d535
   1784 sig                  = c249ee766b4dd256560d48b367d05a41cf7169306247ec
   1785                        56c51c39412b34c11015e365c2b2836761ba020b7175e6
   1786                        0870572a6c7f780eeabb6f0777783064d602
   1787 ]]></sourcecode>
   1788           <sourcecode type="pseudocode"><![CDATA[
   1789 (W2) payment preparation (wallet)
   1790 
   1791 contribution₀        = KUDOS:5.12
   1792 contribution₁        = KUDOS:2.3
   1793 sig₀                 = 8876dce4ca504df355f17c783e8327ea29b2cbcd7dde60
   1794                        8b473644af3580621d3eb429022f6d1c4937328db478c6
   1795                        ed9784f6788e2e18dc16927efd4bc9c10908
   1796 sig₁                 = 031283a02cb413308cea4b69bd3d1b7beef87be7788fcf
   1797                        c1d7b83f8d97cd4ede218d0f753ba8fc92e22415a66065
   1798                        f5c1dff402368de8e85eca0c0ac7358e3602
   1799 ]]></sourcecode>
   1800           <sourcecode type="pseudocode"><![CDATA[
   1801 (M3) deposit preparation (merchant)
   1802 
   1803 ]]></sourcecode>
   1804           <sourcecode type="pseudocode"><![CDATA[
   1805 (E1) deposit check (exchange)
   1806 
   1807 time_exchange        = Sat Feb 14 13:37:44 2026
   1808 sig                  = 09338dd4b1e692431290355b7df62d627a894718db68cf
   1809                        4a8e083bfed7b6c98a0dde3c5724f3cb3db0e6737f57c9
   1810                        eb35136997eaf403f27f82c0a9f1cf27d308
   1811 ]]></sourcecode>
   1812           <sourcecode type="pseudocode"><![CDATA[
   1813 (M2) deposit verification (merchant)
   1814 
   1815 sig                  = e66d503c843d72da4b6eb95f872396449de25cbf80b9c2
   1816                        43d8c9ed2bde533d2460542c685bfdbf2eabc755510a60
   1817                        b97ed289711fd3f353cd80aa791e2e2f1e0d
   1818 ]]></sourcecode>
   1819         </section>
   1820         <section anchor="tc1-refund">
   1821           <name>Refund</name>
   1822           <sourcecode type="pseudocode"><![CDATA[
   1823 (W1) refund request (wallet)
   1824 
   1825 ]]></sourcecode>
   1826           <sourcecode type="pseudocode"><![CDATA[
   1827 (M1) refund processing (merchant)
   1828 
   1829 id                   = 14365434601518496594
   1830 value₀               = KUDOS:2.1
   1831 sig₀                 = a626cc04101e3abe295c217de5636be135be8935dfaf0b
   1832                        3589a8c7de22c3e6c7a581a031c0691476e82ee0e9798c
   1833                        3c8c8be6bc1066bd955acf4d1ce59eb7e10d
   1834 ]]></sourcecode>
   1835           <sourcecode type="pseudocode"><![CDATA[
   1836 (E1) refund check and confirmation (exchange)
   1837 
   1838 sig₀                 = be9dd11dec0e2fb2a2dfbc778b2d9bb21c665ecfa4d1b6
   1839                        c9d42747902f071631f84a946881bc787f8627a6871226
   1840                        4b06410b445f37e569edb7dbf77193b5990b
   1841 ]]></sourcecode>
   1842           <sourcecode type="pseudocode"><![CDATA[
   1843 (M2) refund confirmation (merchant)
   1844 
   1845 value                = KUDOS:2.1
   1846 ]]></sourcecode>
   1847         </section>
   1848         <section anchor="tc1-refresh">
   1849           <name>Refresh</name>
   1850           <sourcecode type="pseudocode"><![CDATA[
   1851 (W1) coin melting (wallet)
   1852 
   1853 refresh_seed         = 466431296486ed9cd71fc207254820a2c4a85aeb0b2041
   1854                        494f8bf1f8cd30f11394223cf8a82995804957876e9fa7
   1855                        1163506b4e5b8c8fa4db1b95d3e8c5c5fb5a
   1856 for k = 0:
   1857  batch_seedₖ         = 415e62ec89f6397c834087efe396b127c6d5bdfe360145
   1858                        a6abbfc7a88c6504eee6e3f59db026cc5742c4065fd917
   1859                        bbf2b7f52e82e88409263130300279e52617
   1860  transferₖ₀.priv     = 5a08ea181dddd480b2e1e2294e1d886efe45070858adb3
   1861                        26e2d562dc330c8ca4
   1862  transferₖ₁.priv     = dccf4e1880b343687c7f39df603386a27510bd356ae1bc
   1863                        86f45ef9b7a8927613
   1864  transferₖ₀.pub      = ab4a35f7fc78a3d07e5828f0fae0295ebbe93e9ecc63c1
   1865                        09703f15816af8d000
   1866  transferₖ₁.pub      = 09893d5ef58fe696207e93cbd0cceb311265aa89745705
   1867                        9c40f366d59b028a29
   1868  sharedₖ₀            = a7a9524dfc565b8006470ab90cba091a809f1de14eeda0
   1869                        dc98408f880d5cf587c2aa338ea1e3153ed8c624044f15
   1870                        19f3d8e8d6c731d7af6d0383b136a48a8e7f
   1871  sharedₖ₁            = dd7051d4c4b03d78f0c5365ea0a2947f48604beee2e792
   1872                        0349d7a4371dbff00d9986202459277250461ab936d5f7
   1873                        45bb6c6c28e8badd7936002f25d9b97a65b2
   1874  coinₖ₀.priv         = c4fe7e3e64453e477e736ebabe2e5a7c4919eb2fa4bf02
   1875                        9e536d56a7eec59c9a
   1876  coinₖ₁.priv         = 409db2ea007fff35506607da6c67e52204097be8a114b7
   1877                        a654f53da392886e48
   1878  coinₖ₀.pub          = 65a93d56a84e8110fc2ae9c6ace89ddd9c625bd632501b
   1879                        663fefd047ee31feed
   1880  coinₖ₁.pub          = 7c61cf322d34ead1de43869690c70e22d9bae8f2354e0d
   1881                        d07e71c5736b506f41
   1882  blind_secretₖ₀      = 0f53bafa492d5d90dd3ad13ba7b37b3c4a8b167dffc63f
   1883                        7940dcb340275be90b
   1884  blind_secretₖ₁      = 799169aeddfec48aaab23a88df8d74318870c7b6cb3922
   1885                        5a3c43d4576db61f88
   1886  planchetₖ₀          = 90997841cb9d3b4bef237213b1ee1da9286e775c1cc10d
   1887                        c78e32f836d7897500a587babeefed3f310a5b509c29d1
   1888                        91804b89d2aee75073f4d49d7ff5f60be991e0ae1a148e
   1889                        134b92c5c9537a59bc30516e0244e714ec2b6067337ffd
   1890                        970fd3987799d2ac7b3e3430068c923974751864ed8f4d
   1891                        087b0cd62e0edb807d9ac4bf70e68c9d774a0f26947413
   1892                        0f4fa5a8f4e0a5ac67ef6c73a1cb486792605f447384ea
   1893                        9deb040f851953db240a5f23401e0d75f93f810132ed9e
   1894                        782ba05b4f78ce7cafc501925ce0bde12e58ef48861969
   1895                        038a95802a1d943b2ce31a3278a1cb4f14cc12ff2ffee1
   1896                        3aba0ee151145a3b7abdd1a00e0684a57a1b2a0fd97348
   1897                        81243b
   1898  planchetₖ₁          = 0562f874175e223f087e7950f2082e869bca1ded7087be
   1899                        27a98f1f9be30a38f33e9a98ca5efb6f15536df774ce32
   1900                        1efd36909d67869e704db3ff352c76298c0d33014a32ff
   1901                        636c22866b5e5d6dbc5e6c50f630d95112e8916fd23ec4
   1902                        88eb457f55ad3a29d50c3c7387b4ee1045cbe4d37241e9
   1903                        b958d1642b34f4a15a259b344163dbf73bc55e5b99e0d4
   1904                        6ba59b7dca0a1fbe859f6f7d5756d6afff58571fdac617
   1905                        48a81e5e94e784c2d5de60a192d86c0529e35f2efa29d4
   1906                        2e0ce8526db5fd3258a470a43d55c184287fe0c639ff8a
   1907                        eea1ee64a61d6466d15e20c8203a73ce1b2fc7b2949947
   1908                        f9804b0710e41351af67cc30b86108dca7ea0208062ae6
   1909                        0be2e5
   1910  h_planchetₖ₀        = ba016fdedb6c5033f1f870edd9ab10d0dd116c0e3a8483
   1911                        0ddd44c9aed5a2844aea96146cf7c72153a910ca3d3de1
   1912                        faab7fca5e1c4079e2e0c680410cf68ee27b
   1913  h_planchetₖ₁        = c4f4451f85f02c950fba164ccc52fd2123576ddad6ab87
   1914                        c25b175a33aed8afff5c5866b2fbcec6ef67a1367f91e5
   1915                        da56041371bc9e8cefd2a93ad386504568a3
   1916  h_planchetsₖ        = 7e420d01a6413fb6cc300257031f37ab2d456583d3189c
   1917                        3e5f7049c1c61f49c7918289b7cd169cebd0bb81ca0a83
   1918                        2f2c4c6c7529e861a88d65c6d3ef5fd540ff
   1919 for k = 1:
   1920  batch_seedₖ         = 0311a9766673b9df343498afcd6f6926b9bd6352201351
   1921                        5c072a0b5a3af98aeb8158869f3ece08532473980a652d
   1922                        d6479f296a28504b850791f9775e3b0f8436
   1923  transferₖ₀.priv     = 4a3d33228a7c1d6330fb2ec827256aad75f7ea56712072
   1924                        f8ff69238b47e98895
   1925  transferₖ₁.priv     = ad0b2c176a9564ea7aee7c55ddd92af22d777ea4a8605b
   1926                        d486d8ccc31bb1402f
   1927  transferₖ₀.pub      = 1839010739d0450e9a0702167d5106dbcb0a81641e0080
   1928                        716785850e60bc541d
   1929  transferₖ₁.pub      = 16a20ed27a63c204d94ef3d0c2b554343567d319afc70d
   1930                        856cc6a61c3bdaa142
   1931  sharedₖ₀            = 32751bb2cf2a3106593aac0fb38172943c54a96992b22a
   1932                        7927ce37fcf0b9b4aa4671033c93ece3c70f2033e4c52a
   1933                        953bf46254db7f6d7feb926d78b28bb60901
   1934  sharedₖ₁            = 2c4118e0d52fe1851410fb70b60cc5b3fa6bbb53df8acc
   1935                        5a379c65d9f89c2ba37ea732e76d081e03d845dd2f3ef8
   1936                        a53b682941d4e598a17823ea06cd28058e8d
   1937  coinₖ₀.priv         = 16977a220b0bfcb2a0ef82faa3afea901d0cf3e6829905
   1938                        85b63d9c855be5d5aa
   1939  coinₖ₁.priv         = 1b5bab529c09f313f2a18e3d2712c1a7e0548f15651b40
   1940                        af12b22c17ca861273
   1941  coinₖ₀.pub          = 4b53ebc94ca1a96ca4795a0ce1254f70ba2fdd72528d57
   1942                        4f4bb47d26fe845239
   1943  coinₖ₁.pub          = 6de1ac4370a5336349ed50cfd4d6298b193504c1325614
   1944                        9cb0fa85c1f9a178c7
   1945  blind_secretₖ₀      = 30e3a32819cdc5a2e9b28d7953bba0038eaf701ceaf691
   1946                        a6bf44833ae6f305a9
   1947  blind_secretₖ₁      = 62ac62d9df0b5f71f0b43329baa15c5e79f46b09fe432f
   1948                        cdeb3a9100b31a0fa2
   1949  planchetₖ₀          = 73cbbfab1a58b12c55b4eecf705c9db8fb953f52bfb4fa
   1950                        9922f39641efb85802659d266f979c819294af91cb395c
   1951                        f93f67a0a6b561e445b0a138f04e6428222ccb5ef92a21
   1952                        1da2218953e8aa108f339bbce666a71640f555570d6fec
   1953                        a446b67be82edfa3f90697d5558d7b7707bb87bf790d35
   1954                        35e429d705367f0ceb3fea30f7666ed428679bed440540
   1955                        3f2a9cf5cf75a43f16fc5b63276e9a18bea0c0864587c0
   1956                        a884d1a474f3a248e36183a067e59496d8968427c55e63
   1957                        ac3f0052fc20fea5b9f01b19ee776e7c1bdfa576be42d2
   1958                        1e7214606bea3277878cb7beb7015a242bd9bfaee620dc
   1959                        ccdfda8f34b7174ed28766000d22dd552cd487fdaf9cd0
   1960                        cc1f5f
   1961  planchetₖ₁          = 922bf6290e8f5e8746f68cda30cee9d368f3988b93d26d
   1962                        c753e082fe56db8191430ce8ef78f1175d651b491e6cc6
   1963                        7e0cf34253abcf3c3bbae44b4620ca0879171710caac83
   1964                        89704d99d5d49da5de04b44f03d03b30df9d872611d779
   1965                        6c6903fdee77a68a29aabac5c332588aaecf2a5e8cbfe4
   1966                        446d33f423040e7eda99268f2ca558615b541cd912ef30
   1967                        2a9f079705b9d1785839a593d07d8b79756f0077cb5169
   1968                        a3a88f08ee7371419c940f35250d2aa52bcfc6beab73b9
   1969                        72f31d3b5de16e55c590788cb4443dc0de7d2cb6993555
   1970                        0b04b8bcc2c33669f97ed1d36f29c594c6f0f84a72bd73
   1971                        f76c7617e748356f7989a98deca97f360fcf2d087f9bcc
   1972                        d61732
   1973  h_planchetₖ₀        = 6523f04c8eacea9af24c08905eb009c8e15a6c62adfae2
   1974                        fcee6813bba22ba014c3c831cae6fb63a2a889af0e99ea
   1975                        d40a39b57d42043dd67fe4e446c7691558c3
   1976  h_planchetₖ₁        = f86bf5d2bf56d182ff70b0ecf635401bce1dab4bd52f40
   1977                        023adef27ca2a4165d19b0de911a6a6e41e5811ea1d9cd
   1978                        9bb17dbf9ee518b1f3bfec644e8a36f7fb2e
   1979  h_planchetsₖ        = f63471c1555835b7032ffa41db189f013d1f26dd5bf1fd
   1980                        c79bf18ea8c3f24ec7f31f0b4c1688d7a6a729c7b2c2ee
   1981                        f42a5ce3524ca23a566d74e708eac487b1dc
   1982 for k = 2:
   1983  batch_seedₖ         = 35e8f7b41e25d3ca2c8e70d02be85843b53703f199809f
   1984                        98527e316bda6a457a2fab9d327f96242c4e0afbd6214f
   1985                        aee6a5172aca2b49ad37a12590dc3bbc3f58
   1986  transferₖ₀.priv     = 1ca613b8fbe4a341b2fc617687553e778de9b8d40c462a
   1987                        88bc1ac169d2984da7
   1988  transferₖ₁.priv     = bb8196a4a5b9a646c5424664b8505eb8781ded006c74e7
   1989                        cc719e7a2cc730ae88
   1990  transferₖ₀.pub      = e21056df9fdf4cd94a4175f94a48fce623db6f2bc4097d
   1991                        818f839ec421fe974f
   1992  transferₖ₁.pub      = 0409b44ddfed03111d7dab5af1b71d8b2597ee50772a9f
   1993                        272e799133718fd571
   1994  sharedₖ₀            = 01a355feafd4daafcd6341597b73eee6ca7ad5dfb78758
   1995                        88a373434043d17087ab882cca24e580985068eb1b39b8
   1996                        c0e7f81f03ccca337961cd1d6a528abd3cd1
   1997  sharedₖ₁            = 39cdc5377c7295d1e997a43fdc2aac0f5005e64211f7f0
   1998                        9da36db035ddad5bc32c2dcc4bd5fe1e0d3e471ae8fcfa
   1999                        9cac0fefa8078570b894164194829e54dabf
   2000  coinₖ₀.priv         = 343d0b591fc0c495d2e7cb68f2cb0c24d9b274e3ae8504
   2001                        1dd94454d2856059f6
   2002  coinₖ₁.priv         = 57c9447a9a34e4b7ed5f4bc71122d76dee9583cb578eb8
   2003                        eff2e837bc9a0591e6
   2004  coinₖ₀.pub          = 3b9fb220f7679b3488f8e2710f41d5e6cfee1b6c23bef3
   2005                        04d9dbfc404341fccd
   2006  coinₖ₁.pub          = 6ee277e7bcd2584c5ee8f46cc24b531515a33388e6035d
   2007                        00b33df8ce6a7edaee
   2008  blind_secretₖ₀      = f5d25d0124dce3b3529325b6512fd34293448b710217fa
   2009                        885ba5d80705d16a64
   2010  blind_secretₖ₁      = 974dc1b68e4a7613346375372ead838842bab6335d1696
   2011                        af3b6a2ad249fee4ee
   2012  planchetₖ₀          = 55e3f72dfd4c53ba21f6f9e108c34f8f6bf0b69dd8daab
   2013                        bf4386a7e3a31c7e33ecda1dc54a31a1d5f97b810806f9
   2014                        d845af20716f4aad733026ff0f6ad0219a1f92d937ade7
   2015                        6b268f8d436fdf6ca63d9051008efa3af022c9846fdecc
   2016                        79ce27c8e59042795f2f8a4bc0a792b44bc64c8e6e7c27
   2017                        3a107d96081142b1d06718e28b32bc733ff36e7b95538f
   2018                        b2ec30d1242965f9ab40debe4ed845227b7a4a4d795286
   2019                        6b798253cf1eb664a1d832c2397d044122d24982fb88bd
   2020                        68f81efa45f80bdbe918680004bdea5dc2e4e76dfed297
   2021                        af200350793f820aa094e1b26c79e2c2faff866410e741
   2022                        1bb662c94be10a841ec9db1432d198a4a01c2911326cec
   2023                        da502a
   2024  planchetₖ₁          = 978fca7d513afac1d6ec6561fd967218bf0d84e388a23f
   2025                        b085f1c37493d765090b90c0c23ba20647114c0f34d8db
   2026                        1041809a66dfeab96c36477be8342ff4f2660cfd8f0011
   2027                        14f2aab3d12d983d82b92fcfb38e97fa83142980a9f919
   2028                        7e794859f439b18491600ea92bcdc1af7ebe4784eb0229
   2029                        bd287b9c71cdde177d4576d7907f9d643a363e09685293
   2030                        b7474c990d5d8cdc119d7448d768412e40e8461ea88109
   2031                        461e37f3a76178df074c942e99062ce717eba48903c7a0
   2032                        cd27889429ac5a657ca50efd441363c18f9968b33962e4
   2033                        960bf2005fc0fb2b8050024bf34e8f608f4dade5554aab
   2034                        1d28478f5bc1c5939c939ff5b9b11f225e7eb275887d3a
   2035                        475a34
   2036  h_planchetₖ₀        = 5c9603dc7240248f0a93107bce217562d60943c9976770
   2037                        d11c1fd4c9f73fe7f2f3696696b37fb0fa73331c301e8d
   2038                        d7adceafb23456bfcb6d44063d61f5db239e
   2039  h_planchetₖ₁        = d905de829b86b21eb19c036320d3e11571e6ca8390e81f
   2040                        86e4569e3cc12189ea10cd752c738972a809fa292818a1
   2041                        f13367c389a3f505f084c5001615de3b647e
   2042  h_planchetsₖ        = 802838537720786bbe61a0752397056c3a7f7bc332a54d
   2043                        c5a649452a9a74fef79c2c59deaf1e03cf73f85f241f28
   2044                        61a50f2f859d95c3c660ab5e57b448526036
   2045 value                = KUDOS:0.25
   2046 commitment           = ba2a18eb9cc878b20dde4679910aede08b37b58e47df25
   2047                        2a245598e0671ed6fc012c9cc245d13f9759d777d80d51
   2048                        d4a29bcdba486109d83075b8bf47fc518928
   2049 sig                  = 62ce04a6a6dd6b3f50792e34b51ccc10d2552425800566
   2050                        90248790f6280db11f6f29753f601f19e8504ea378574a
   2051                        dec5b1fc6f5509f3ec79af3110bb4cd4670a
   2052 ]]></sourcecode>
   2053           <sourcecode type="pseudocode"><![CDATA[
   2054 (E1) gamma selection and coin signing (exchange)
   2055 
   2056 ɣ                    = 1
   2057 blind_sig₀           = 1885a01f26936f28dfd201a7dd615dacd68a287e17aa8d
   2058                        d1e4f3a1925047049a491c1b76ca687431faf6fd290deb
   2059                        4dc80601ba79d7754c84a8d8550a0b166104b6ec7e611f
   2060                        bc577aff339033d421035578029068a84bd4fe5e212670
   2061                        fd2ce7091ef9950ee48778aae2855a99555308ae90b72a
   2062                        b1fb53fea714841c94e256705aae8efeebc877efd376a8
   2063                        78c6e2cb4e811a267484e4da8e13206c1dde7ef3646528
   2064                        c1d8bf48096eabcc454ed5ee180e3fe7229785a51a3b8b
   2065                        d3fba176c05baf0eb82e99d225cfa5f9359d07d2510013
   2066                        301a7bdf815a7db36d400bc00ca861dbe1402ec6dacbba
   2067                        901e8c8e4e8f1912e63e2a440e667cea243d46e08026d3
   2068                        738fab
   2069 blind_sig₁           = 9c10e5b88fe3563bdaba5934447baad4d05e66a9075102
   2070                        7a5cbdd2cf0cd9bcaaec68935d3c85509894247ab569d9
   2071                        7fd4825a7972d48dbab1c9cbf791776c96a8dcf48caf2e
   2072                        542f5e50f86d794066b7bc82e975c55995b40cf10d00e6
   2073                        4904530dad5c396543fadf88b79f81b00c8ebbaf2f6731
   2074                        f434c5c3d72b451586d0412b0272a6c6ac5ba5ef59af57
   2075                        969d4f985ea513187c8020a318d4a9c9711ccfdb5aa8b9
   2076                        ebd93b20e129c3447771a1dfb1b1bbdccaef56323005c5
   2077                        6116b1df97ace4ae6f6865e5467a96d2fad9cb4c9cf0c0
   2078                        3cf774ad1dd8f5b0a0fe218ac78b37c4435e4f5616c2fd
   2079                        96dba36f3c7c1973835fe53c95839ed11c792ad011c9fb
   2080                        1ce55c
   2081 sig                  = 6eb68d755e7e554ade9f9f21e3a04b83a74753ec136f98
   2082                        981ec2369d0fd56f88c274fe44482f425f1142a447627b
   2083                        71e2117d9991d89dfbf97441b881963a360a
   2084 ]]></sourcecode>
   2085           <sourcecode type="pseudocode"><![CDATA[
   2086 (W2) secret revelation (wallet)
   2087 
   2088 revealed_seed₀       = 415e62ec89f6397c834087efe396b127c6d5bdfe360145
   2089                        a6abbfc7a88c6504eee6e3f59db026cc5742c4065fd917
   2090                        bbf2b7f52e82e88409263130300279e52617
   2091 revealed_seed₂       = 35e8f7b41e25d3ca2c8e70d02be85843b53703f199809f
   2092                        98527e316bda6a457a2fab9d327f96242c4e0afbd6214f
   2093                        aee6a5172aca2b49ad37a12590dc3bbc3f58
   2094 ]]></sourcecode>
   2095           <sourcecode type="pseudocode"><![CDATA[
   2096 (E2) commitment validation (exchange)
   2097 
   2098 ]]></sourcecode>
   2099           <sourcecode type="pseudocode"><![CDATA[
   2100 (W3) coin unblinding (wallet)
   2101 
   2102 coinᵧ₀.sig           = 68773443fe6cf88ddea6f6614213f12ec7ded4fbb39fa0
   2103                        a4ffc1a68bbfc363be0b33bd03a41d31c8ffe331614ee4
   2104                        b986679ac8e51aaa0903eee492d0ff81327589c842ac80
   2105                        a6b47e0833840935e9cd543fbbb91c5b80a591e01eb34d
   2106                        7bb5aa3fe837b22f8dcfcaf0ee9d71d93c866f00a8f787
   2107                        def0b79eaa4e6e96c420990b05c2b82c378757ce220e96
   2108                        734e547a6962148848d2ebb66e9c67a40115a958d21c05
   2109                        c7e0a0db72e505076e35ddca7b09b603b55dad394c1d12
   2110                        ff4b6b219feafc3ca24c43c36ad2da9fa632ec1bcfc057
   2111                        2db80d0afcc9875182def7983385f872005033d7ea7080
   2112                        bce0df982a134f5ae2dccb2cdc304278c809979252ac28
   2113                        2a76e1
   2114 coinᵧ₁.sig           = 1551b2dcf6daa264d4c96452f46c88e7b4ca3955642da4
   2115                        5e375cb319602897ceb75eda64060afd17002b63fdd39c
   2116                        c0f86c473a530813c23958573431e2fcd2277cc853f5ab
   2117                        6a20a9e7499154420f0cd8d13990d45423e61a6651a614
   2118                        7e8a146a10fd5d63e085c2c4c133d4db0827df1d4fed10
   2119                        d1e6eadc566e167a17fd36ee884900db9a8cc4b82a02b7
   2120                        ca0cfacb7d391f535da3011ca469146f239d621fcdfc10
   2121                        563bfe6ac4c962109e2fc39aa236151f15a9c85b8e0e4e
   2122                        2ee4f6b6b5f54337c184936e2fe4029e2d39ffe6953f7d
   2123                        cf208ba062334e8595dbb9784857df770377a59dee2a8b
   2124                        ee4e9c10e662f15dedd0379849ebc4a7a02a31f1ebd8a8
   2125                        e55432
   2126 coin₂                = coinᵧ₀
   2127 coin₃                = coinᵧ₁
   2128 ]]></sourcecode>
   2129         </section>
   2130         <section anchor="tc1-link">
   2131           <name>Link</name>
   2132           <sourcecode type="pseudocode"><![CDATA[
   2133 (W1) history request (wallet)
   2134 
   2135 sig                  = ceb8dc24e263252b479376b15ae141e4da28dd712c37c4
   2136                        81a163d549b44afdd018d04fe709462a56739b3cc0671c
   2137                        2cc0333b7e5da25210b8bda54d83d25f5407
   2138 ]]></sourcecode>
   2139           <sourcecode type="pseudocode"><![CDATA[
   2140 (E1) refresh secret lookup (exchange)
   2141 
   2142 ]]></sourcecode>
   2143           <sourcecode type="pseudocode"><![CDATA[
   2144 (W2) coin acquisition (wallet)
   2145 
   2146 ]]></sourcecode>
   2147         </section>
   2148         <section anchor="tc1-w2w-account">
   2149           <name>Account Creation</name>
   2150         </section>
   2151         <section anchor="tc1-w2w-push">
   2152           <name>Push Payment</name>
   2153         </section>
   2154         <section anchor="tc1-w2w-pull">
   2155           <name>Pull Payment</name>
   2156         </section>
   2157         <section anchor="tc1-withdraw-recoup">
   2158           <name>Recoup Withdrawal</name>
   2159         </section>
   2160         <section anchor="tc1-refresh-recoup">
   2161           <name>Recoup Refresh</name>
   2162         </section>
   2163       </section>
   2164       <section anchor="test-case-2">
   2165         <name>Test Case 2</name>
   2166       </section>
   2167     </section>
   2168     <section anchor="change-log">
   2169       <name>Change log</name>
   2170     </section>
   2171     <section numbered="false" anchor="acknowledgments">
   2172       <name>Acknowledgments</name>
   2173       <t>[ TBD ]</t>
   2174       <t>This work was supported in part by the German Federal Ministry of
   2175 Education and Research (BMBF) within the project Concrete Contracts.</t>
   2176     </section>
   2177   </back>
   2178   <!-- ##markdown-source:
   2179 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
   2215 yIG/fiw5kjR/P/Qo2LXpQavZpkdK9EiJHlmgB7uEHpaqe8DP1lir8PF+Q6ex
   2216 /a5PrffBQO+NYhsc9LylkyeenC+gZWAV1DKgADNZYMzmzqAWtumrtJnMnHb6
   2217 9lvPOG9vOWKs9Nk5nt/loJGd/e2IvvpDfCtLvnGTAiLrgj5nK0glqIkxjRL2
   2218 I930jN559h8AVL+hX5zth96BxbHPgulYa2wp6YTHnmR34DmQBfQ28S7AgNcJ
   2219 jx7fuYudPT3jYUfpkzERcw868CAiHWp3FaTAvli95fblkd8X2VM8dg5BYzl8
   2220 54nY36ceg+BJlkGWWsI22j9b7uArD33CnXSlVe0NS5FSttp6AcxAwMvd2ucj
   2221 Qqz+X7+nGzNy8oWvrXhJPpXrqRWBDdJ7H+QbT+RPMdt7egGbbZe8oXTJ8yAC
   2222 v1TmreNFehxGGrgt2qM79qP10j3NecUTa7Gg91e8C2T+4H2gb0aW0EB2nn8I
   2223 lPR2Agw1X1hmuf/G+ipWE9x/c07/LFf6nBa5XJ+QaPll0jy+uTU6pn/H/q5j
   2224 mhesoGUScCeYE1b79ekEeChcSENuXgcGPo72pDmE0Fhee7t/6NkNN+0t+XR1
   2225 EH386eMD68MfRJ9Zlvv808eeTZZuC+k6u4XnHmPZDyzHR3s8ms1nY89CDly6
   2226 r/b/F3tz+zMxuHRFBvbVBLAYD3XelrbglQd/AQSG8iUsDd+K7sMEO3oMXGrN
   2227 NlgEiHA6ct+YeW+CAYUQmfl5C0uX50CegPFR407OZxuz3APGJ8zIHZz3zOrm
   2228 tm+v/cxf2bownrc3pkbb6TXixiN+dTtK8/wX0Hu3oyop4v2+yHzuFzw07h4e
   2229 +Zkfen9L29LdW4Jk5tPp/PXSa8wvnn6KJ3c5rOWFfac9HjkFGvTvXtcy7o/o
   2230 Gc0AxHl7GLLDRZtDWOPWNRV+2kFUx4/nCk45J+nzoNpKcE/tW2F+e+BUd6Pr
   2231 wHbrxcwKKs3KKnfiKviJJML4m2DpCQDi7DI/8ElHMGg2e08Oog352C0cT8Ku
   2232 Dg/eE6L/aCm6hhj9DHL0bvze28wnHZYHd5DL52EGxrE2RMHRW5xZxgm/TpZk
   2233 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
   2323 ibcOMdhyvmjjxi7AEjn28OkGxFftNA47yqJpqvD8zmf3nx49vvPV0d3PP37y
   2324 zNVX0pRac7CnHJnuPhvbunlXJtAMpd+stF+uO/yO4EXPFOh8bidw96Nn24rZ
   2325 b/2VPw0udmGcPuGHb9u62qJL3LKpTr+7egr+wtEvx5f9/PKSO7+DiYa/Hrbm
   2326 ZS9v/pIp/Jhn/vB1bn7QtUp7gs9eOl/aUMyx892vdzxzD3iKwjC3wtoPbZ60
   2327 499bvozm/c5293WX03H8y2sO810TI9nrLSgct/y8s9kxvysYZphtHJOm+87x
   2328 6nCnbf4QTr13TeTHPPOHr3Pzg/7ToptB60X9L3YxKX76uxmiakufzP/+Z7v7
   2329 uivpeH023buf+K2cLJdrSvS2GxkObX72Ge2Y49adv+rs3962Od/vb+WP2Y6B
   2330 ZQ2r0+ZOEpLMU3Y9u1Qu3tszNz+46o72TusfODi9R5YYKL7tVdTFmxZ10OXR
   2331 +VKvgQ3mSo8us1l7zn7jpnBBW0cUiqhGm7oy6Mk2VdKjAGUzUJYBg3U1jsux
   2332 WUYhcmFrTy2u4wHxLDWQDiGWDuBqwMvBaDU/cVUb7vizzZIil/WNd0gtyCdK
   2333 uIABt7FOujZkZ/teBBoQd+qPqy3oomcTtrbH+HRKa8NHFJWaXbjTGou5fc6A
   2334 iw/b/icWVvoeOOEhVBUZSkWmF4c7duQqBd3ui+AreXpk59cv+gq70l4wIt6Y
   2335 EI6kljB06EjPsF9B9EIVpT95mFC1ZHPrQXTDNZ9raT+mm8eqKeS/cWDrkn3u
   2336 1JHbUDdu9zF/yNJb3/hHB7y2ecmtLO1dsqt8rXs/PfX0KEBAWsjGEQ4+pWuC
   2337 wncX9VMtwzlM56FEgf5a/BFO+N4+tj/o7qOf3q37o8bwUIoONGA7d+i/A4Kz
   2338 nRtJJY7ocPl2FA6wX9z57LP7z4+e3n92/+nv7h+9+Pj5o3tP77w4sCpkLwqH
   2339 c2GqVhoJRn+39RUclia0F1Dzd+2ZlJ1bfy7N6RQVxMRv4t5h1dZf+/s+za9X
   2340 UNhY4aawsOdm+IDVyWTlghJtWVXLbS7n0QfL4Mu5y/e4mL/S+7dG3qMMHEXz
   2341 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
   2377 1dzYSn7nrg3pay7ePAH5ZdQ7AlXd2o7ou51f4uMum21O3XaTaw5Ae4LVPeM/
   2378 8ATct+fowc8inROu+pZ4mE4B/YLfbu3KgX9OJ9Gq5781mXPb3tx+UzrieEW/
   2379 OZ/SMVOPxXZo+QGfelvLNwfM4aGH3clbfr4d9c+WbI+1Q9rOqPPVtx2d2lOh
   2380 Wyr2rRvAm5E9bzc6wOKvRI06ittTbS7I3top0gEaFZXY7hLbZ9xz2zPntZ5O
   2381 KVoLTUXq5G/prI4vl+uzzpnaaypVofiQHes3tmElNZGlAl49UzddPktjTann
   2382 hjrCLq3GLsw0/vzpvftPjz6+N8Ygh/JWWhbx7kSTvrvbTS7pG/NmWw47Zr39
   2383 8HoGfuiAnjqFdZlsMhvKTNlWIJemp/hRO9kpNulhxyNbvh7WJz+xurxSSzay
   2384 ddjVl+2nQwozrPlHq8Sd9rqT+hAU4kGXttZ4v7/0iY2slnCt75Tgc1qaphp+
   2385 /yl1YaFGVDmm1lOqmuoUQFgoT/w76kZIGgza1yH3vyIV8vA+6ZAHHz993N/3
   2386 jV1vdrRLylFr8jq0b3expyBHmzu/a4+/u1pT70h86m9RyHzq8cDuBL/eKfRl
   2387 2JL8iZ1Blq6p+ZE+w8+zO40l27U5lwKWn3JvdopjP0DXwucBU/jFna8f38e/
   2388 n3/6Q43hQJrWzjhO61W843TeyVPo5DDRhlCDZvsLNbUL4RXXw8GWIdJLW92F
   2389 PtPI+dxbeUaRyzOa2HeQwbDrWZMco3pZMKOtynaX3+16IPWGbEY65+SFAEhs
   2390 FhbuudeU+puPd3PisW+n1oxLWYS2jxg/d1GK1WnwoW3xOGXPCErHpxcvT+cn
   2391 E+ly2+2bD7SNbigtqRh31RRF+oJFn0PlBht5QGOBja1Wt8GFDxu5b3L4Xdu1
   2392 vSbriNoR2dr+fepPSU0ZqJ3i4ehO0zqjIYHtIAHynq9se59mIX7/XHdAl33l
   2393 K/xd6W+byeXqOQk9HXYTzzxGA4Wkdgn/vgPAdkOATnmp34pleKeEa25AvaBH
   2394 2z0GJtPJiooAPp5RcxvdbVOAPdBTY1fncp08yTBIL7npYDRx/Grfb7eRfbUR
   2395 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
   2809 NwHd4uW6G9wyhWsBV+oKA9VzXs7I0jWWwn68I59qMMIyYrSd794gOgCsZunV
   2810 FJSWT6NgZjRC0YOpU5CYxBG3LA9A6R5TbiT4MFbPGnSZsIyshDJwWKuk4Vb+
   2811 XMR+qZ6PkH0TgrdeoVu1hPigUTB7gGVzhv6qnO4cEFJJcauSn5a+IIdSuK5A
   2812 bhU7k+6zV4wgJa7hnVrHrJ7MkJqV05uKzxXO9VCNJNAV419cloAgjnDaO+Ee
   2813 rkabAyarMUDAc7UGLbmAai6d2qI8HrvM8pwTxQ3Mp7m7U7OqI0e7eQGDFqT4
   2814 ADf0VUabBcJQHZ9FCBlL2IZ22EmdkiX1lV33EEpIM/dsaEbpMus89tBhs3bi
   2815 msSN4QHvKCzKK7mt4UN851T0bSXVPJ7T0EN9Wb2Z5KS9XqIE5ruaHNlt9VdJ
   2816 J7sp/gJrODMe5X4uDpA0vDFizKekaXmgpdk4mUUFaCobMMuZwwkaefdBpPSP
   2817 n/7uF7ePDubDZ/79zmf+7aOgw9+/fPPqg5oDXuvV56Ucvn359N3bx99/Rszk
   2818 pCkFr5vDwVbVv4sHzhWG2tk8mJkV93Q4OpUvC4ueywCaWrdiUHqf+ymhb9D9
   2819 Fq9WmQRM2Nfux1CY6HhfHb/vvaaycCKdZL2hp1OBtuLhmRwQk++piFx6Fx+w
   2820 3cPbt6/ev/u/scAPw9Da+Jf3L59efgIGf1z8X48hNbLbV4/rGWR8GD/nvv9l
   2821 e/6tP3wQ3HzPM/yguvnxQ+/eS3zjwyceHj77iYeHP/wg3cE3vjsPu/vl4/WB
   2822 n376s3off/rJ29c6EF+1p3Vz/Pftq2dppIe33+i/fj1evXn7PWjxGz3X04t/
   2823 /as371/39bjmF7/Y7eFp/YIv+e0/3r7+8q9vv/2nFy++5qTdvn/7+Or2fXu6
   2824 PT0LHq55Yynftcfvbv33t+++Xbe/W4+vm6QW53rkPX7z8g0HlPP5dr/4m/l+
   2825 fJw+9w/rabXH8e3tL778zZd/+5c3vSvfpe949/j2n9fg0d++0dYu/eISeXv6
   2826 1Yv/BZ6eRypnXAEA
   2827 
   2828 -->
   2829 
   2830 </rfc>