diff options
Diffstat (limited to 'src/testing/testing_api_cmd_recoup.c')
-rw-r--r-- | src/testing/testing_api_cmd_recoup.c | 231 |
1 files changed, 74 insertions, 157 deletions
diff --git a/src/testing/testing_api_cmd_recoup.c b/src/testing/testing_api_cmd_recoup.c index 7c4204d9e..cefcd96bb 100644 --- a/src/testing/testing_api_cmd_recoup.c +++ b/src/testing/testing_api_cmd_recoup.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2014-2018 Taler Systems SA + Copyright (C) 2014-2023 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -54,88 +54,44 @@ struct RecoupState struct TALER_EXCHANGE_RecoupHandle *ph; /** - * NULL if coin was not refreshed, otherwise reference - * to the melt operation underlying @a coin_reference. + * If the recoup filled a reserve, this is set to the reserve's public key. */ - const char *melt_reference; + struct TALER_ReservePublicKeyP reserve_pub; /** - * If the recoup filled a reserve, this is set to the reserve's public key. + * Entry in the coin's history generated by this operation. */ - struct TALER_ReservePublicKeyP reserve_pub; + struct TALER_EXCHANGE_CoinHistoryEntry che; + + /** + * Public key of the refunded coin. + */ + struct TALER_CoinSpendPublicKeyP coin; /** * Reserve history entry, set if this recoup actually filled up a reserve. * Otherwise `reserve_history.type` will be zero. */ - struct TALER_EXCHANGE_ReserveHistory reserve_history; + struct TALER_EXCHANGE_ReserveHistoryEntry reserve_history; }; /** - * Parser reference to a coin. - * - * @param coin_reference of format $LABEL['#' $INDEX]? - * @param[out] cref where we return a copy of $LABEL - * @param[out] idx where we set $INDEX - * @return #GNUNET_SYSERR if $INDEX is present but not numeric - */ -static int -parse_coin_reference (const char *coin_reference, - char **cref, - unsigned int *idx) -{ - const char *index; - - /* 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 (coin_reference, '#'); - if (NULL == index) - { - *idx = 0; - *cref = GNUNET_strdup (coin_reference); - return GNUNET_OK; - } - *cref = GNUNET_strndup (coin_reference, - index - coin_reference); - if (1 != sscanf (index + 1, - "%u", - idx)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Numeric index (not `%s') required after `#' in command reference of command in %s:%u\n", - index, - __FILE__, - __LINE__); - GNUNET_free (*cref); - *cref = NULL; - return GNUNET_SYSERR; - } - return GNUNET_OK; -} - - -/** * Check the result of the recoup request: checks whether * the HTTP response code is good, and that the coin that * was paid back belonged to the right reserve. * * @param cls closure - * @param hr HTTP response details - * @param reserve_pub public key of the reserve receiving the recoup, NULL if refreshed or on error - * @param old_coin_pub public key of the dirty coin, NULL if not refreshed or on error + * @param rr response details */ static void recoup_cb (void *cls, - const struct TALER_EXCHANGE_HttpResponse *hr, - const struct TALER_ReservePublicKeyP *reserve_pub, - const struct TALER_CoinSpendPublicKeyP *old_coin_pub) + const struct TALER_EXCHANGE_RecoupResponse *rr) { struct RecoupState *ps = cls; + const struct TALER_EXCHANGE_HttpResponse *hr = &rr->hr; struct TALER_TESTING_Interpreter *is = ps->is; - struct TALER_TESTING_Command *cmd = &is->commands[is->ip]; const struct TALER_TESTING_Command *reserve_cmd; char *cref; unsigned int idx; @@ -143,29 +99,22 @@ recoup_cb (void *cls, ps->ph = NULL; if (ps->expected_response_code != hr->http_status) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Unexpected response code %u/%d to command %s in %s:%u\n", - hr->http_status, - (int) hr->ec, - cmd->label, - __FILE__, - __LINE__); - json_dumpf (hr->reply, - stderr, - 0); - fprintf (stderr, "\n"); - TALER_TESTING_interpreter_fail (is); + TALER_TESTING_unexpected_status (is, + hr->http_status, + ps->expected_response_code); return; } if (GNUNET_OK != - parse_coin_reference (ps->coin_reference, - &cref, - &idx)) + TALER_TESTING_parse_coin_reference ( + ps->coin_reference, + &cref, + &idx)) { TALER_TESTING_interpreter_fail (is); return; } + (void) idx; /* do NOT use! We ignore 'idx', must be 0 for melt! */ reserve_cmd = TALER_TESTING_interpreter_lookup_command (is, cref); @@ -182,52 +131,11 @@ recoup_cb (void *cls, { case MHD_HTTP_OK: /* check old_coin_pub or reserve_pub, respectively */ - if (NULL != ps->melt_reference) - { - 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; - } - } - else { const struct TALER_ReservePrivateKeyP *reserve_priv; - 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); @@ -236,7 +144,7 @@ recoup_cb (void *cls, } GNUNET_CRYPTO_eddsa_key_get_public (&reserve_priv->eddsa_priv, &ps->reserve_pub.eddsa_pub); - if (0 != GNUNET_memcmp (reserve_pub, + if (0 != GNUNET_memcmp (&rr->details.ok.reserve_pub, &ps->reserve_pub)) { GNUNET_break (0); @@ -247,6 +155,7 @@ recoup_cb (void *cls, TALER_amount_is_valid (&ps->reserve_history.amount)) ps->reserve_history.type = TALER_EXCHANGE_RTT_RECOUP; /* ps->reserve_history.details.recoup_details.coin_pub; // initialized earlier */ + ps->che.details.recoup.reserve_pub = ps->reserve_pub; } break; case MHD_HTTP_NOT_FOUND: @@ -279,18 +188,20 @@ recoup_run (void *cls, struct RecoupState *ps = cls; const struct TALER_TESTING_Command *coin_cmd; const struct TALER_CoinSpendPrivateKeyP *coin_priv; - const struct TALER_DenominationBlindingKeyP *blinding_key; const struct TALER_EXCHANGE_DenomPublicKey *denom_pub; const struct TALER_DenominationSignature *coin_sig; - struct TALER_PlanchetSecretsP planchet; + const struct TALER_PlanchetMasterSecretP *planchet; char *cref; unsigned int idx; + const struct TALER_ExchangeWithdrawValues *ewv; + struct TALER_DenominationHashP h_denom_pub; ps->is = is; if (GNUNET_OK != - parse_coin_reference (ps->coin_reference, - &cref, - &idx)) + TALER_TESTING_parse_coin_reference ( + ps->coin_reference, + &cref, + &idx)) { TALER_TESTING_interpreter_fail (is); return; @@ -306,7 +217,6 @@ recoup_run (void *cls, TALER_TESTING_interpreter_fail (is); return; } - if (GNUNET_OK != TALER_TESTING_get_trait_coin_priv (coin_cmd, idx, @@ -316,18 +226,25 @@ recoup_run (void *cls, TALER_TESTING_interpreter_fail (is); return; } - + GNUNET_CRYPTO_eddsa_key_get_public (&coin_priv->eddsa_priv, + &ps->coin.eddsa_pub); + if (GNUNET_OK != + TALER_TESTING_get_trait_exchange_wd_value (coin_cmd, + idx, + &ewv)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } if (GNUNET_OK != - TALER_TESTING_get_trait_blinding_key (coin_cmd, - idx, - &blinding_key)) + TALER_TESTING_get_trait_planchet_secret (coin_cmd, + &planchet)) { GNUNET_break (0); TALER_TESTING_interpreter_fail (is); return; } - planchet.coin_priv = *coin_priv; - planchet.blinding_key = *blinding_key; GNUNET_CRYPTO_eddsa_key_get_public ( &coin_priv->eddsa_priv, &ps->reserve_history.details.recoup_details.coin_pub.eddsa_pub); @@ -341,7 +258,6 @@ recoup_run (void *cls, TALER_TESTING_interpreter_fail (is); return; } - if (GNUNET_OK != TALER_TESTING_get_trait_denom_sig (coin_cmd, idx, @@ -351,18 +267,30 @@ recoup_run (void *cls, TALER_TESTING_interpreter_fail (is); return; } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Trying to recoup denomination '%s'\n", TALER_B2S (&denom_pub->h_key)); - - ps->ph = TALER_EXCHANGE_recoup (is->exchange, - denom_pub, - coin_sig, - &planchet, - NULL != ps->melt_reference, - recoup_cb, - ps); + ps->che.type = TALER_EXCHANGE_CTT_RECOUP; + ps->che.amount = ps->reserve_history.amount; + TALER_planchet_blinding_secret_create (planchet, + ewv, + &ps->che.details.recoup.coin_bks); + TALER_denom_pub_hash (&denom_pub->key, + &h_denom_pub); + TALER_wallet_recoup_sign (&h_denom_pub, + &ps->che.details.recoup.coin_bks, + coin_priv, + &ps->che.details.recoup.coin_sig); + ps->ph = TALER_EXCHANGE_recoup ( + TALER_TESTING_interpreter_get_context (is), + TALER_TESTING_get_exchange_url (is), + TALER_TESTING_get_keys (is), + denom_pub, + coin_sig, + ewv, + planchet, + &recoup_cb, + ps); GNUNET_assert (NULL != ps->ph); } @@ -398,7 +326,7 @@ recoup_cleanup (void *cls, * @param index index number of the object to offer. * @return #GNUNET_OK on success */ -static int +static enum GNUNET_GenericReturnValue recoup_traits (void *cls, const void **ret, const char *trait, @@ -410,10 +338,13 @@ recoup_traits (void *cls, return GNUNET_SYSERR; /* no traits */ { struct TALER_TESTING_Trait traits[] = { - TALER_TESTING_make_trait_reserve_pub (0, - &ps->reserve_pub), + TALER_TESTING_make_trait_reserve_pub (&ps->reserve_pub), TALER_TESTING_make_trait_reserve_history (0, &ps->reserve_history), + TALER_TESTING_make_trait_coin_history (0, + &ps->che), + TALER_TESTING_make_trait_coin_pub (0, + &ps->coin), TALER_TESTING_trait_end () }; @@ -425,22 +356,10 @@ recoup_traits (void *cls, } -/** - * Make a "recoup" command. - * - * @param label the command label - * @param expected_response_code expected HTTP status code - * @param coin_reference reference to any command which - * offers a coin & reserve private key. - * @param melt_reference NULL if coin was not refreshed - * @param amount how much do we expect to recoup? - * @return the command. - */ struct TALER_TESTING_Command TALER_TESTING_cmd_recoup (const char *label, unsigned int expected_response_code, const char *coin_reference, - const char *melt_reference, const char *amount) { struct RecoupState *ps; @@ -448,11 +367,9 @@ TALER_TESTING_cmd_recoup (const char *label, ps = GNUNET_new (struct RecoupState); ps->expected_response_code = expected_response_code; ps->coin_reference = coin_reference; - ps->melt_reference = melt_reference; - if ( (NULL != amount) && - (GNUNET_OK != - TALER_string_to_amount (amount, - &ps->reserve_history.amount)) ) + if (GNUNET_OK != + TALER_string_to_amount (amount, + &ps->reserve_history.amount)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to parse amount `%s' at %s\n", |