gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-exchange] 01/02: modify /payback API and test usage


From: gnunet
Subject: [GNUnet-SVN] [taler-exchange] 01/02: modify /payback API and test usage of that API to pass/return additional information required when dealing with payback of refreshed coins
Date: Tue, 23 Jul 2019 21:57:16 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository exchange.

commit e8a892c29aed9b08f800878ad4d6e789f9571b64
Author: Christian Grothoff <address@hidden>
AuthorDate: Tue Jul 23 21:56:21 2019 +0200

    modify /payback API and test usage of that API to pass/return additional 
information required when dealing with payback of refreshed coins
---
 src/include/taler_exchange_service.h   |   6 +-
 src/include/taler_testing_lib.h        |   6 +-
 src/lib/exchange_api_deposit.c         |   2 +-
 src/lib/exchange_api_payback.c         | 100 ++++++++++++++------
 src/lib/test_auditor_api.c             |   6 +-
 src/lib/test_exchange_api.c            |   9 +-
 src/lib/test_exchange_api_revocation.c |   9 +-
 src/lib/testing_api_cmd_deposit.c      |  20 ++--
 src/lib/testing_api_cmd_payback.c      | 167 ++++++++++++++++++++++-----------
 src/lib/testing_api_cmd_refresh.c      |  11 ++-
 10 files changed, 227 insertions(+), 109 deletions(-)

diff --git a/src/include/taler_exchange_service.h 
b/src/include/taler_exchange_service.h
index 7fc7a569..7bcfee9e 100644
--- a/src/include/taler_exchange_service.h
+++ b/src/include/taler_exchange_service.h
@@ -1651,7 +1651,8 @@ struct TALER_EXCHANGE_PaybackHandle;
  * @param amount amount the exchange will wire back for this coin,
  *        on error the total balance remaining, or NULL
  * @param timestamp what time did the exchange receive the /payback request
- * @param reserve_pub public key of the reserve receiving the payback
+ * @param reserve_pub public key of the reserve receiving the payback, NULL if 
refreshed or on error
+ * @param old_coin_pub public key of the dirty coin, NULL if not refreshed or 
on error
  * @param full_response full response from the exchange (for logging, in case 
of errors)
  */
 typedef void
@@ -1661,6 +1662,7 @@ typedef void
                                          const struct TALER_Amount *amount,
                                          struct GNUNET_TIME_Absolute timestamp,
                                          const struct TALER_ReservePublicKeyP 
*reserve_pub,
+                                         const struct 
TALER_CoinSpendPublicKeyP *old_coin_pub,
                                          const json_t *full_response);
 
 
@@ -1673,6 +1675,7 @@ typedef void
  * @param pk kind of coin to pay back
  * @param denom_sig signature over the coin by the exchange using @a pk
  * @param ps secret internals of the original planchet
+ * @param was_refreshed #GNUNET_YES if the coin in @a ps was refreshed
  * @param payback_cb the callback to call when the final result for this 
request is available
  * @param payback_cb_cls closure for @a payback_cb
  * @return NULL
@@ -1684,6 +1687,7 @@ TALER_EXCHANGE_payback (struct TALER_EXCHANGE_Handle 
*exchange,
                         const struct TALER_EXCHANGE_DenomPublicKey *pk,
                         const struct TALER_DenominationSignature *denom_sig,
                         const struct TALER_PlanchetSecretsP *ps,
+                        int was_refreshed,
                         TALER_EXCHANGE_PaybackResultCallback payback_cb,
                         void *payback_cb_cls);
 
diff --git a/src/include/taler_testing_lib.h b/src/include/taler_testing_lib.h
index beb28f7a..c08cfdc5 100644
--- a/src/include/taler_testing_lib.h
+++ b/src/include/taler_testing_lib.h
@@ -1388,14 +1388,15 @@ TALER_TESTING_cmd_refund (const char *label,
  *        the index of the coin using "$LABEL#$INDEX" syntax.
  *        Here, $INDEX must be a non-negative number.
  * @param amount denomination to pay back.
- *
+ * @param NULL if coin was not refreshed, otherwise label of the melt operation
  * @return the command.
  */
 struct TALER_TESTING_Command
 TALER_TESTING_cmd_payback (const char *label,
                            unsigned int expected_response_code,
                            const char *coin_reference,
-                           const char *amount);
+                           const char *amount,
+                           const char *melt_reference);
 
 
 /**
@@ -1406,7 +1407,6 @@ TALER_TESTING_cmd_payback (const char *label,
  * @param coin_reference reference to a CMD that will offer the
  *        denomination to revoke.
  * @param config_filename configuration file name.
- *
  * @return the command.
  */
 struct TALER_TESTING_Command
diff --git a/src/lib/exchange_api_deposit.c b/src/lib/exchange_api_deposit.c
index 865e9b0c..72aefca1 100644
--- a/src/lib/exchange_api_deposit.c
+++ b/src/lib/exchange_api_deposit.c
@@ -172,7 +172,7 @@ auditor_cb (void *cls,
 static int
 verify_deposit_signature_ok (struct TALER_EXCHANGE_DepositHandle *dh,
                              const json_t *json,
-                            struct TALER_ExchangeSignatureP *exchange_sig,
+                             struct TALER_ExchangeSignatureP *exchange_sig,
                              struct TALER_ExchangePublicKeyP *exchange_pub)
 {
   const struct TALER_EXCHANGE_Keys *key_state;
diff --git a/src/lib/exchange_api_payback.c b/src/lib/exchange_api_payback.c
index a23ad7be..64dfa379 100644
--- a/src/lib/exchange_api_payback.c
+++ b/src/lib/exchange_api_payback.c
@@ -79,6 +79,11 @@ struct TALER_EXCHANGE_PaybackHandle
    */
   struct TALER_CoinSpendPublicKeyP coin_pub;
 
+  /**
+   * #GNUNET_YES if the coin was refreshed
+   */
+  int was_refreshed;
+
 };
 
 
@@ -97,12 +102,13 @@ verify_payback_signature_ok (const struct 
TALER_EXCHANGE_PaybackHandle *ph,
                              const json_t *json)
 {
   struct TALER_PaybackConfirmationPS pc;
+  struct TALER_PaybackRefreshConfirmationPS pr;
   struct TALER_ExchangePublicKeyP exchange_pub;
   struct TALER_ExchangeSignatureP exchange_sig;
   struct TALER_Amount amount;
   struct GNUNET_TIME_Absolute timestamp;
   const struct TALER_EXCHANGE_Keys *key_state;
-  struct GNUNET_JSON_Specification spec[] = {
+  struct GNUNET_JSON_Specification spec_withdraw[] = {
     GNUNET_JSON_spec_fixed_auto ("exchange_sig", &exchange_sig),
     GNUNET_JSON_spec_fixed_auto ("exchange_pub", &exchange_pub),
     TALER_JSON_spec_amount ("amount", &amount),
@@ -110,10 +116,18 @@ verify_payback_signature_ok (const struct 
TALER_EXCHANGE_PaybackHandle *ph,
     GNUNET_JSON_spec_fixed_auto ("reserve_pub", &pc.reserve_pub),
     GNUNET_JSON_spec_end()
   };
+  struct GNUNET_JSON_Specification spec_refresh[] = {
+    GNUNET_JSON_spec_fixed_auto ("exchange_sig", &exchange_sig),
+    GNUNET_JSON_spec_fixed_auto ("exchange_pub", &exchange_pub),
+    TALER_JSON_spec_amount ("amount", &amount),
+    GNUNET_JSON_spec_absolute_time ("timestamp", &timestamp),
+    GNUNET_JSON_spec_fixed_auto ("old_coin_pub", &pr.old_coin_pub),
+    GNUNET_JSON_spec_end()
+  };
 
   if (GNUNET_OK !=
       GNUNET_JSON_parse (json,
-                         spec,
+                         ph->was_refreshed ? spec_refresh : spec_withdraw,
                          NULL, NULL))
   {
     GNUNET_break_op (0);
@@ -122,32 +136,54 @@ verify_payback_signature_ok (const struct 
TALER_EXCHANGE_PaybackHandle *ph,
   key_state = TALER_EXCHANGE_get_keys (ph->exchange);
   if (GNUNET_OK !=
       TALER_EXCHANGE_test_signing_key (key_state,
-                                      &exchange_pub))
+                                       &exchange_pub))
   {
     GNUNET_break_op (0);
     return GNUNET_SYSERR;
   }
-  pc.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_PAYBACK);
-  pc.purpose.size = htonl (sizeof (pc));
-  pc.timestamp = GNUNET_TIME_absolute_hton (timestamp);
-  TALER_amount_hton (&pc.payback_amount,
-                     &amount);
-  pc.coin_pub = ph->coin_pub;
-  if (GNUNET_OK !=
-      GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_EXCHANGE_CONFIRM_PAYBACK,
-                                  &pc.purpose,
-                                  &exchange_sig.eddsa_signature,
-                                  &exchange_pub.eddsa_pub))
+  if (ph->was_refreshed)
   {
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
+    pr.purpose.purpose = htonl 
(TALER_SIGNATURE_EXCHANGE_CONFIRM_PAYBACK_REFRESH);
+    pr.purpose.size = htonl (sizeof (pr));
+    pr.timestamp = GNUNET_TIME_absolute_hton (timestamp);
+    TALER_amount_hton (&pr.payback_amount,
+                       &amount);
+    pr.coin_pub = ph->coin_pub;
+    if (GNUNET_OK !=
+        GNUNET_CRYPTO_eddsa_verify 
(TALER_SIGNATURE_EXCHANGE_CONFIRM_PAYBACK_REFRESH,
+                                    &pr.purpose,
+                                    &exchange_sig.eddsa_signature,
+                                    &exchange_pub.eddsa_pub))
+    {
+      GNUNET_break_op (0);
+      return GNUNET_SYSERR;
+    }
+  }
+  else
+  {
+    pc.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_PAYBACK);
+    pc.purpose.size = htonl (sizeof (pc));
+    pc.timestamp = GNUNET_TIME_absolute_hton (timestamp);
+    TALER_amount_hton (&pc.payback_amount,
+                       &amount);
+    pc.coin_pub = ph->coin_pub;
+    if (GNUNET_OK !=
+        GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_EXCHANGE_CONFIRM_PAYBACK,
+                                    &pc.purpose,
+                                    &exchange_sig.eddsa_signature,
+                                    &exchange_pub.eddsa_pub))
+    {
+      GNUNET_break_op (0);
+      return GNUNET_SYSERR;
+    }
   }
   ph->cb (ph->cb_cls,
           MHD_HTTP_OK,
-         TALER_EC_NONE,
+          TALER_EC_NONE,
           &amount,
           timestamp,
-          &pc.reserve_pub,
+          ph->was_refreshed ? NULL : &pc.reserve_pub,
+          ph->was_refreshed ? &pr.old_coin_pub : NULL,
           json);
   return GNUNET_OK;
 }
@@ -204,16 +240,17 @@ handle_payback_finished (void *cls,
                                              history,
                                              &total))
       {
-       GNUNET_break_op (0);
-       response_code = 0;
+        GNUNET_break_op (0);
+        response_code = 0;
       }
       ph->cb (ph->cb_cls,
-             response_code,
-             TALER_JSON_get_error_code (j),
-             &total,
-             GNUNET_TIME_UNIT_FOREVER_ABS,
-             NULL,
-             j);
+              response_code,
+              TALER_JSON_get_error_code (j),
+              &total,
+              GNUNET_TIME_UNIT_FOREVER_ABS,
+              NULL,
+              NULL,
+              j);
       TALER_EXCHANGE_payback_cancel (ph);
       return;
     }
@@ -245,10 +282,11 @@ handle_payback_finished (void *cls,
   }
   ph->cb (ph->cb_cls,
           response_code,
-         TALER_JSON_get_error_code (j),
+          TALER_JSON_get_error_code (j),
           NULL,
           GNUNET_TIME_UNIT_FOREVER_ABS,
           NULL,
+          NULL,
           j);
   TALER_EXCHANGE_payback_cancel (ph);
 }
@@ -263,6 +301,7 @@ handle_payback_finished (void *cls,
  * @param pk kind of coin to pay back
  * @param denom_sig signature over the coin by the exchange using @a pk
  * @param ps secret internals of the original planchet
+ * @param was_refreshed #GNUNET_YES if the coin in @a ps was refreshed
  * @param payback_cb the callback to call when the final result for this 
request is available
  * @param payback_cb_cls closure for @a payback_cb
  * @return NULL
@@ -274,6 +313,7 @@ TALER_EXCHANGE_payback (struct TALER_EXCHANGE_Handle 
*exchange,
                         const struct TALER_EXCHANGE_DenomPublicKey *pk,
                         const struct TALER_DenominationSignature *denom_sig,
                         const struct TALER_PlanchetSecretsP *ps,
+                        int was_refreshed,
                         TALER_EXCHANGE_PaybackResultCallback payback_cb,
                         void *payback_cb_cls)
 {
@@ -302,12 +342,13 @@ TALER_EXCHANGE_payback (struct TALER_EXCHANGE_Handle 
*exchange,
 
   payback_obj = json_pack ("{s:o, s:o," /* denom pub/sig */
                            " s:o, s:o," /* coin pub/sig */
-                           " s:o}", /* coin_bks */
+                           " s:o, s:o}", /* coin_bks */
                            "denom_pub_hash", GNUNET_JSON_from_data_auto 
(&h_denom_pub),
                            "denom_sig", GNUNET_JSON_from_rsa_signature 
(denom_sig->rsa_signature),
                            "coin_pub", GNUNET_JSON_from_data_auto 
(&pr.coin_pub),
                            "coin_sig", GNUNET_JSON_from_data_auto (&coin_sig),
-                           "coin_blind_key_secret", GNUNET_JSON_from_data_auto 
(&ps->blinding_key)
+                           "coin_blind_key_secret", GNUNET_JSON_from_data_auto 
(&ps->blinding_key),
+                           "refreshed", json_boolean (was_refreshed)
                          );
   if (NULL == payback_obj)
   {
@@ -323,6 +364,7 @@ TALER_EXCHANGE_payback (struct TALER_EXCHANGE_Handle 
*exchange,
   ph->cb = payback_cb;
   ph->cb_cls = payback_cb_cls;
   ph->url = TEAH_path_to_url (exchange, "/payback");
+  ph->was_refreshed = was_refreshed;
   eh = TEL_curl_easy_get (ph->url);
   if (GNUNET_OK !=
       TALER_curl_easy_post (&ph->ctx,
diff --git a/src/lib/test_auditor_api.c b/src/lib/test_auditor_api.c
index 88548e80..6595ea76 100644
--- a/src/lib/test_auditor_api.c
+++ b/src/lib/test_auditor_api.c
@@ -474,7 +474,8 @@ run (void *cls,
     TALER_TESTING_cmd_payback ("payback-1",
                                MHD_HTTP_OK,
                                "payback-withdraw-coin-1",
-                               "EUR:5"),
+                               "EUR:5",
+                               NULL),
     /**
      * Re-withdraw from this reserve
      */
@@ -536,7 +537,8 @@ run (void *cls,
     TALER_TESTING_cmd_payback ("payback-2",
                                MHD_HTTP_OK,
                                "payback-withdraw-coin-2a",
-                               "EUR:0.5"),
+                               "EUR:0.5",
+                               NULL),
     TALER_TESTING_cmd_end ()
   };
 
diff --git a/src/lib/test_exchange_api.c b/src/lib/test_exchange_api.c
index e317f7a7..dc868d1d 100644
--- a/src/lib/test_exchange_api.c
+++ b/src/lib/test_exchange_api.c
@@ -688,7 +688,8 @@ run (void *cls,
     TALER_TESTING_cmd_payback ("payback-1",
                                MHD_HTTP_OK,
                                "payback-withdraw-coin-1",
-                               "EUR:5"),
+                               "EUR:5",
+                               NULL),
 
     /* Check the money is back with the reserve */
     TALER_TESTING_cmd_status ("payback-reserve-status-1",
@@ -799,11 +800,13 @@ run (void *cls,
 
     TALER_TESTING_cmd_payback ("payback-2", MHD_HTTP_OK,
                                "payback-withdraw-coin-2a",
-                               "EUR:0.5"),
+                               "EUR:0.5",
+                               NULL),
 
     TALER_TESTING_cmd_payback ("payback-2b", MHD_HTTP_FORBIDDEN,
                                "payback-withdraw-coin-2a",
-                               "EUR:0.5"),
+                               "EUR:0.5",
+                               NULL),
 
     TALER_TESTING_cmd_deposit
       ("payback-deposit-revoked",
diff --git a/src/lib/test_exchange_api_revocation.c 
b/src/lib/test_exchange_api_revocation.c
index e2e3e4b4..090b38b2 100644
--- a/src/lib/test_exchange_api_revocation.c
+++ b/src/lib/test_exchange_api_revocation.c
@@ -162,7 +162,8 @@ run (void *cls,
     TALER_TESTING_cmd_payback ("payback-1",
                                MHD_HTTP_OK,
                                "refresh-reveal-1",
-                               "EUR:5"),
+                               "EUR:5",
+                               "refresh-melt-1"),
     /**
      * Melt original coin AGAIN
      * (EUR:4.00 = 3x EUR:1.03 + 7x EUR:0.13) */
@@ -189,12 +190,14 @@ run (void *cls,
     TALER_TESTING_cmd_payback ("payback-2",
                                MHD_HTTP_OK,
                                "refresh-melt-2",
-                               "EUR:5"),
+                               "EUR:5",
+                               "refresh-melt-2"),
     /* Refund original coin to reserve */
     TALER_TESTING_cmd_payback ("payback-3",
                                MHD_HTTP_OK,
                                "withdraw-coin-1",
-                               "EUR:5"),
+                               "EUR:5",
+                               NULL),
     /* Check the money is back with the reserve */
     TALER_TESTING_cmd_status ("payback-reserve-status-1",
                               "create-reserve-1",
diff --git a/src/lib/testing_api_cmd_deposit.c 
b/src/lib/testing_api_cmd_deposit.c
index 6fa2310d..1868e8bd 100644
--- a/src/lib/testing_api_cmd_deposit.c
+++ b/src/lib/testing_api_cmd_deposit.c
@@ -449,8 +449,8 @@ deposit_traits (void *cls,
 
   if (GNUNET_OK !=
       TALER_TESTING_get_trait_coin_priv (coin_cmd,
-                                        ds->coin_index,
-                                        &coin_spent_priv))
+                                         ds->coin_index,
+                                         &coin_spent_priv))
   {
     GNUNET_break (0);
     TALER_TESTING_interpreter_fail (ds->is);
@@ -461,26 +461,26 @@ deposit_traits (void *cls,
     /* First two traits are only available if
        ds->traits is #GNUNET_YES */
     TALER_TESTING_make_trait_exchange_pub (0,
-                                          &ds->exchange_pub),
+                                           &ds->exchange_pub),
     TALER_TESTING_make_trait_exchange_sig (0,
-                                          &ds->exchange_sig),
+                                           &ds->exchange_sig),
     /* These traits are always available */
     TALER_TESTING_make_trait_coin_priv (0,
-                                       coin_spent_priv),
+                                        coin_spent_priv),
     TALER_TESTING_make_trait_wire_details (0,
-                                          ds->wire_details),
+                                           ds->wire_details),
     TALER_TESTING_make_trait_contract_terms (0,
-                                            ds->contract_terms),
+                                             ds->contract_terms),
     TALER_TESTING_make_trait_peer_key (0,
-                                      &ds->merchant_priv.eddsa_priv),
+                                       &ds->merchant_priv.eddsa_priv),
     TALER_TESTING_make_trait_amount (0,
                                      ds->amount),
     TALER_TESTING_trait_end ()
   };
 
   return TALER_TESTING_get_trait ((ds->traits_ready)
-                                 ? traits
-                                 : &traits[2],
+                                  ? traits
+                                  : &traits[2],
                                   ret,
                                   trait,
                                   index);
diff --git a/src/lib/testing_api_cmd_payback.c 
b/src/lib/testing_api_cmd_payback.c
index ac4fd641..9f81c706 100644
--- a/src/lib/testing_api_cmd_payback.c
+++ b/src/lib/testing_api_cmd_payback.c
@@ -98,6 +98,13 @@ struct PaybackState
    * Handle to the ongoing operation.
    */
   struct TALER_EXCHANGE_PaybackHandle *ph;
+
+  /**
+   * NULL if coin was not refreshed, otherwise reference
+   * to the melt operation underlying @a coin_reference.
+   */
+  const char *melt_reference;
+
 };
 
 /**
@@ -111,8 +118,8 @@ struct PaybackState
  * @param amount amount the exchange will wire back for this coin.
  * @param timestamp what time did the exchange receive the
  *        /payback request
- * @param reserve_pub public key of the reserve affected by the
- *        payback.
+ * @param reserve_pub public key of the reserve receiving the payback, NULL if 
refreshed or on error
+ * @param old_coin_pub public key of the dirty coin, NULL if not refreshed or 
on error
  * @param full_response raw response from the exchange.
  */
 static void
@@ -122,15 +129,13 @@ payback_cb (void *cls,
             const struct TALER_Amount *amount,
             struct GNUNET_TIME_Absolute timestamp,
             const struct TALER_ReservePublicKeyP *reserve_pub,
+            const struct TALER_CoinSpendPublicKeyP *old_coin_pub,
             const json_t *full_response)
 {
   struct PaybackState *ps = cls;
   struct TALER_TESTING_Interpreter *is = ps->is;
   struct TALER_TESTING_Command *cmd = &is->commands[is->ip];
   const struct TALER_TESTING_Command *reserve_cmd;
-  const struct TALER_ReservePrivateKeyP *reserve_priv;
-  struct TALER_ReservePublicKeyP rp;
-  struct TALER_Amount expected_amount;
   char *cref;
   const char *index;
   unsigned int idx;
@@ -150,7 +155,7 @@ payback_cb (void *cls,
     return;
   }
 
-  /* We allow command referneces of the form "$LABEL#$INDEX" or
+  /* We allow command references of the form "$LABEL#$INDEX" or
      just "$LABEL", which implies the index is 0. Figure out
      which one it is. */
   index = strchr (ps->coin_reference, '#');
@@ -189,41 +194,90 @@ payback_cb (void *cls,
     return;
   }
 
-  if (GNUNET_OK != TALER_TESTING_get_trait_reserve_priv
-    (reserve_cmd, idx, &reserve_priv))
-  {
-    GNUNET_break (0);
-    TALER_TESTING_interpreter_fail (is);
-    return;
-  }
-
-  GNUNET_CRYPTO_eddsa_key_get_public (&reserve_priv->eddsa_priv,
-                                      &rp.eddsa_pub);
-
   switch (http_status)
   {
   case MHD_HTTP_OK:
-    if (GNUNET_OK != TALER_string_to_amount
-      (ps->amount, &expected_amount))
+    /* first, check amount */
     {
-      GNUNET_break (0);
-      TALER_TESTING_interpreter_fail (is);
-      return;
+      struct TALER_Amount expected_amount;
+
+      if (GNUNET_OK !=
+          TALER_string_to_amount (ps->amount, &expected_amount))
+      {
+        GNUNET_break (0);
+        TALER_TESTING_interpreter_fail (is);
+        return;
+      }
+      if (0 != TALER_amount_cmp (amount, &expected_amount))
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    "Total amount missmatch to command %s\n",
+                    cmd->label);
+        json_dumpf (full_response, stderr, 0);
+        TALER_TESTING_interpreter_fail (is);
+        return;
+      }
     }
-    if (0 != TALER_amount_cmp (amount, &expected_amount))
+    /* now, check old_coin_pub or reserve_pub, respectively */
+    if (NULL != ps->melt_reference)
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  "Total amount missmatch to command %s\n",
-                  cmd->label);
-      json_dumpf (full_response, stderr, 0);
-      TALER_TESTING_interpreter_fail (is);
-      return;
+      const struct TALER_TESTING_Command *melt_cmd;
+      const struct TALER_CoinSpendPrivateKeyP *dirty_priv;
+      struct TALER_CoinSpendPublicKeyP oc;
+
+      melt_cmd = TALER_TESTING_interpreter_lookup_command (is,
+                                                           ps->melt_reference);
+      if (NULL == melt_cmd)
+      {
+        GNUNET_break (0);
+        TALER_TESTING_interpreter_fail (is);
+        return;
+      }
+      if (GNUNET_OK !=
+          TALER_TESTING_get_trait_coin_priv (melt_cmd,
+                                             0,
+                                             &dirty_priv))
+      {
+        GNUNET_break (0);
+        TALER_TESTING_interpreter_fail (is);
+        return;
+      }
+      GNUNET_CRYPTO_eddsa_key_get_public (&dirty_priv->eddsa_priv,
+                                          &oc.eddsa_pub);
+      if (0 != GNUNET_memcmp (&oc,
+                              old_coin_pub))
+      {
+        GNUNET_break (0);
+        TALER_TESTING_interpreter_fail (is);
+        return;
+      }
     }
-    if (0 != GNUNET_memcmp (reserve_pub, &rp))
+    else
     {
-      GNUNET_break (0);
-      TALER_TESTING_interpreter_fail (is);
-      return;
+      const struct TALER_ReservePrivateKeyP *reserve_priv;
+      struct TALER_ReservePublicKeyP rp;
+
+      if (NULL == reserve_priv)
+      {
+        GNUNET_break (0);
+        TALER_TESTING_interpreter_fail (is);
+        return;
+      }
+      if (GNUNET_OK != TALER_TESTING_get_trait_reserve_priv
+          (reserve_cmd, idx, &reserve_priv))
+      {
+        GNUNET_break (0);
+        TALER_TESTING_interpreter_fail (is);
+        return;
+      }
+      GNUNET_CRYPTO_eddsa_key_get_public (&reserve_priv->eddsa_priv,
+                                          &rp.eddsa_pub);
+      if (0 != GNUNET_memcmp (reserve_pub, &rp))
+      {
+        GNUNET_break (0);
+        TALER_TESTING_interpreter_fail (is);
+        return;
+      }
     }
     break;
   default:
@@ -309,6 +363,7 @@ payback_run (void *cls,
                                    denom_pub,
                                    coin_sig,
                                    &planchet,
+                                   NULL != ps->melt_reference,
                                    payback_cb,
                                    ps);
   GNUNET_assert (NULL != ps->ph);
@@ -465,14 +520,15 @@ revoke_run (void *cls,
  * @param coin_reference reference to any command which
  *        offers a coin & reserve private key.
  * @param amount denomination to pay back.
- *
+ * @param melt_reference NULL if coin was not refreshed
  * @return the command.
  */
 struct TALER_TESTING_Command
 TALER_TESTING_cmd_payback (const char *label,
                            unsigned int expected_response_code,
                            const char *coin_reference,
-                           const char *amount)
+                           const char *amount,
+                           const char *melt_reference)
 {
   struct PaybackState *ps;
 
@@ -480,15 +536,17 @@ TALER_TESTING_cmd_payback (const char *label,
   ps->expected_response_code = expected_response_code;
   ps->coin_reference = coin_reference;
   ps->amount = amount;
-
-  struct TALER_TESTING_Command cmd = {
-    .cls = ps,
-    .label = label,
-    .run = &payback_run,
-    .cleanup = &payback_cleanup
-  };
-
-  return cmd;
+  ps->melt_reference = melt_reference;
+  {
+    struct TALER_TESTING_Command cmd = {
+      .cls = ps,
+      .label = label,
+      .run = &payback_run,
+      .cleanup = &payback_cleanup
+    };
+
+    return cmd;
+  }
 }
 
 
@@ -516,14 +574,15 @@ TALER_TESTING_cmd_revoke (const char *label,
   rs->expected_response_code = expected_response_code;
   rs->coin_reference = coin_reference;
   rs->config_filename = config_filename;
-
-  struct TALER_TESTING_Command cmd = {
-    .cls = rs,
-    .label = label,
-    .run = &revoke_run,
-    .cleanup = &revoke_cleanup,
-    .traits = &revoke_traits
-  };
-
-  return cmd;
+  {
+    struct TALER_TESTING_Command cmd = {
+      .cls = rs,
+      .label = label,
+      .run = &revoke_run,
+      .cleanup = &revoke_cleanup,
+      .traits = &revoke_traits
+    };
+
+    return cmd;
+  }
 }
diff --git a/src/lib/testing_api_cmd_refresh.c 
b/src/lib/testing_api_cmd_refresh.c
index 2bbf189b..bc67af7f 100644
--- a/src/lib/testing_api_cmd_refresh.c
+++ b/src/lib/testing_api_cmd_refresh.c
@@ -88,6 +88,11 @@ struct RefreshMeltState
   struct TALER_EXCHANGE_DenomPublicKey *fresh_pks;
 
   /**
+   * Private key of the dirty coin being melted.
+   */
+  const struct TALER_CoinSpendPrivateKeyP *melt_priv;
+
+  /**
    * Task scheduled to try later.
    */
   struct GNUNET_SCHEDULER_Task *retry_task;
@@ -889,7 +894,6 @@ refresh_melt_run (void *cls,
     (num_fresh_coins,
      struct TALER_EXCHANGE_DenomPublicKey);
   {
-    const struct TALER_CoinSpendPrivateKeyP *melt_priv;
     struct TALER_Amount melt_amount;
     struct TALER_Amount fresh_amount;
     const struct TALER_DenominationSignature *melt_sig;
@@ -907,7 +911,7 @@ refresh_melt_run (void *cls,
     }
 
     if (GNUNET_OK != TALER_TESTING_get_trait_coin_priv
-      (coin_command, 0, &melt_priv))
+      (coin_command, 0, &rms->melt_priv))
     {
       GNUNET_break (0);
       TALER_TESTING_interpreter_fail (rms->is);
@@ -969,7 +973,7 @@ refresh_melt_run (void *cls,
       rms->fresh_pks[i] = *fresh_pk;
     }
     rms->refresh_data = TALER_EXCHANGE_refresh_prepare
-      (melt_priv, &melt_amount, melt_sig, melt_denom_pub,
+      (rms->melt_priv, &melt_amount, melt_sig, melt_denom_pub,
        GNUNET_YES, num_fresh_coins, rms->fresh_pks,
        &rms->refresh_data_length);
 
@@ -1053,6 +1057,7 @@ refresh_melt_traits (void *cls,
   {
     struct TALER_TESTING_Trait traits[] = {
       TALER_TESTING_make_trait_denom_pub (index, &rms->fresh_pks[index]),
+      TALER_TESTING_make_trait_coin_priv (0, rms->melt_priv),
       TALER_TESTING_trait_end ()
     };
 

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]