gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [taler-exchange] branch master updated (7d43ad56 -> 05d5b73


From: gnunet
Subject: [GNUnet-SVN] [taler-exchange] branch master updated (7d43ad56 -> 05d5b735)
Date: Tue, 23 Jul 2019 21:57:15 +0200

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

grothoff pushed a change to branch master
in repository exchange.

    from 7d43ad56 implement postges_get_old_coin_by_h_blind for #5777
     new e8a892c2 modify /payback API and test usage of that API to pass/return 
additional information required when dealing with payback of refreshed coins
     new 05d5b735 typo

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 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..c7ea5091 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_pub)
+      {
+        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]