draft-guetschow-taler-protocol.xml (147044B)
1 <?xml version='1.0' encoding='utf-8'?> 2 <!DOCTYPE rfc [ 3 <!ENTITY nbsp " "> 4 <!ENTITY zwsp "​"> 5 <!ENTITY nbhy "‑"> 6 <!ENTITY wj "⁠"> 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 > 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ᵢ <= 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 <= 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="["9783642146220", "9783642146237"]"/> 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 H4sIAAAAAAAAA+y92XYcR5I2eJ9PEU1dCKhCgrF4bJxi1VBctZBSkVRRqioN 2180 4CuQzUQmOheSaIl9WlX/vMLc/udMX9TMA/w3feZurvqm36H7SeYzX2LJzABA 2181 iVJX9/w4VSKQGeHhbm7LZ+ZmFuPxePTqVpSNRqvJaqpvRTeen+ro4ZMvo+d8 2182 qhfRF4v5ai7n0xsjNZczfoYr1IKb1fhkrVdLeTp/PV7RheNzf+FI8pU+mS8u 2183 bkWTmZmPRpPzxa1otVgvV2kc13E6ej1fvDxZzNfndIXS5xr/ma1Gy9VC87P+ 2184 Zy/1Ba5Wt0ZRNI7sc+xvcnFxvpqfLPj56YX9QEu+PLW/nfOLM9y5HI0+eKVn 2185 a31r9EEULfT5/FZ0ulqdL2/dvHkyWR2ezNYzvTqcL05uTpcqxsQO8fFNuniK 2186 +S9X7eX4fsflN0cjvl6dzheY2xhPjiJHnMeTl/Mpn0QP/9//x5HHfocbb0XP 2187 v7wX3VvoJVYWfTmbvNKL5WR1Ec1N9FzL09l8Oj+5sFdzIRb6Fd0QrrcfE4E0 2188 JvZIT89O59PV3+ODwyiJ7ZcSQ93qXS7nCvO5N46TuKj9J+vZijbmoV6c8Zl7 2189 mD7jk+mt6MzN+7DZ1v91tR4rN9yh0qPRbI57Vpg1bcbTB3fTOPySxMz/mldF 2190 7X8t0ix8Wpas8r9WcZbSr48+vfcAc/v848Mkxv/i8mZdVuNsXLB0nDDcOy6P 2191 MoYLnz161lxXxGl188nHz54fPvj4i2eHSRWPGdgLTNbMbDQaj8egHyjD5Wo0 2192 +uMfoucfvYj++I374myi1BRr+SD6GISYq7VcTeaz3mUf6dd8oaPVKV/hP5Nl 2193 BLZfE0dF+H25mkynEfHveDIjjj8BgZYRn6nojF+AvrMVn8wivVjMF8vD0ZdL 2194 HWGYi/l6Ec1fz6LFZPnyb+jpT+Yr7p48jo5vcCFvHEeg8xyMh4fqaDpZ6QWf 2195 0o5PZifRMa44jvSMdlRFfBndeXb344+jP9hd+OYgej0BI64x3wW2km748I/x 2196 h5E85UQEvTikp/Dou0j0n4LpkqzO7FSIDbkdKRJ0/VTP9vj+xrT07ATfY4Xi 2197 gj7DLfQx/RGmyunec65+rxfzvYuDaHOI3rUH0d/jsjEup3Wt5t2HYOwL9xga 2198 UUxWy703+8c3j+1H9Gtv2LPJbHIGgs3WZwJKCzfTHTfdNGdaYpf44oIeAVWA 2199 PaP9tPetp6vJ+VRH+FBOlkSHyQzqC2O8oeeu8RctY/N5xxfHmChfrqLl5GQ2 2200 MRPJMSI9MxAlDHP85ri/TGKWsJWgJNQK8ZMjDFQdbtkTkxNcoiZ8th8m8bVd 2201 8utTDd48/vqYmJFH53MoEPB98zC/fHyp/249eQV9Seuc+3V8bddBIy4wifnZ 2202 3kVnVTxyH04vohM9A/etML8lhsFctd8NLM+x0i8iEe2dzVX0BCPctJ/0Pupt 2203 jSMxKGTZ7Gak35zPZ5jYpOG74V2geRHBxEGEsdfTefSEZgCJB1WPJwb/fcUX 2204 Ey5wM1/SXlhRPb6NL+g+sLia0GPAG/NzWtWcxiQBn0fCEW6Bp9Jip5OXJPd6 2205 AqN3AYGa3fxkPZ3wDint6hVf8UPYpf4qoQswPLT5sf0KK6BP5+JvtVy5eyzh 2206 48PDWf9G/UZO10vaRND/xFK6v5vLyCzmZ7j12O7kDCubHOpDLD8+iJKDKD2I 2207 Dg/x52yc2Ef8+3//v+hx//Y//s9//+//97GVaLAZt8pJv1nRA44n0e2oPxWM 2208 62e7dNPF/XhSIy2OWc/0GQw7aSA33mS2nq+Jngt+0X82Uehdns9nbpQgPjQf 2209 T9MJTc9RFSoK+nfnXEmt3m1hwUQCuUzOrHgAC9y8CeIpYACoaWw7VCPR2ul3 2210 vZSLybnlRRB4OT/TNOMTMBzYZIkxpnxB3wSAE5n1zNqNZbRnOQS2YHk+WZC8 2211 XMAAvNnHXDYn8wj4JHoQbqQLPoBtuzNO8yL69oPlKccvb0ejf/iHfxj5j/fO 2212 lif70fjX0SlBm9HHs/P16pa12PiC/sGG4CPsCXSbYxyvOj+LfhWl/1uRRHNo 2213 f0JCn69Xzc00mh3E36YmJ0A7dLeZvCEpcGPQfD8DTrkdZWkYhyY3OqYBrP6x 2214 DG5HprvDYsAb2LTomfYkYofg0Zz+U9B/SCiLw5Tu+INHCd8ctuTIk9SRA790 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 hqdwe0VgMu4CZaTmnSGf/D3JysrO13NDuAJ+zEjNI/wxmdrp/ip64ub+xsvB 2234 pjKNvovIG0+KPT/G/oGLc+w92d9vVn3bXrRn4x5P9slxbyN4eOwvb0dJEJTo 2235 CRjko+kEO/EMDjAH1wc0cV9BmyQ17J12v5HJswbMmoP76t6zOx0rhlVa+ZTr 2236 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 2312 T25PtpB7SkRd4+JXk6UTFSujrmac27rOyUKNifwXQQNyADsobataSM787TYT 2313 d+myZvsRHIiKN1MBODh3YL15dadA2Ltz0ebPuF3JeOvbm90//khfv2hYeuNb 2314 fB9F9xxjunGeul2312ETNkcaeMr2FX5Lx+1Ps//bywFQc1vvQFkby+DnpNNh 2315 Kfx4B826D1p2okDChVXfvyHf1tJbacPXUxKSmZmcrB0XhLxRm04VIpSB20OE 2316 ct+avT2rTvYHVOPSaoGQw+FHCOmwGKG9sDO5SE+X4M2NiGQb9gjjUIQSY/ic 2317 a1vFOIUBnbnIzUYo32u5wOkuqaufjwbLfWfpAyJr62U3Vef6DW6bEOG5C845 2318 E0ns2KYSUmRzgDcdOcmmtXnmTj1YIuJZYywMvpckI20VFnZwxoWtKLf2Ul6M 2319 rUlaWE1Cswt3YDw7cxCgGd1ou+qQh/5uUjbVZmVBk7+6W6VpYzn9xX3wQfS5 2320 CPGk++O7tuKNYsodafr2g8Y0OMzo2b5j22bRr6P42Gtrqmal34InSXNbkHYm 2321 ZEk1qB3OoWudUcOH4YYts3Uw4iuQS6xXDdYLAMU9spcxQo8AEgYC6HG2e5j9 2322 xD/IIQoXP3OD0lRb04idgKEIyUMbcMRWJ3bH3x+dAVLaWI4/xyNk+XdrC9ec 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 +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 2369 XG8DlTsOpod8rC5nuSh419ekDgSeVU6PiAXC0VfDDj72dBDdCAON6bu2Ftif 2370 Ljcl2hhhNn+91+XXhTbrmYL54gqU1J7Zwp8+KBzuHzWruN0NizimtTzrIyTd 2371 5Go3+YN2lIMrHrrfPOYwsG7jjjc8Gy4Ztbis05xNUqUIVb598uzzJ41ruL95 2372 Hvb4/tO7j+48eX509/Mnz5/eufu8C/N2HsL2ooj+FHa3TA54Xq1Y/oQT33l0 2373 1oecm2dnmyT3NKc47/PP731OObFrMYWU2atdJqstorEf/GbzFTYn1A58YluG 2374 3oVUPNNT32AObBtSTsRFe7bwWjdHKXQQGk5rwluSupF5OqZehvGaY+reUxrC 2375 HX7b8KFl0rf7fjWunFZHj/ni5b0J1WKQ1to+6QoHUO1x08HmfOgguDufka1q 2376 d2d8GwevlER8dO/+F58/+/j5gTeEe52d2zghHQVLSB8Sd/iD0mZ1Xi98t3n2 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 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 2806 9NxLjjh7h9m+J4csxd/c1JsJEtM8OLcU9lLHmlQToaPqQ5nOjnPVH8BTc+UA 2807 fEtiuJkrGue8hv/VDu/qEcQ8fQ1ALXvOnW9ALHy4KvskHXEXBpTea5DzbJwR 2808 PMzSmF1Y09njaeK3JjLtMWpRB5KbIpTas0uGARcl9KsSyzt1tB2WhKcqkD6P 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>