diff options
author | Christian Grothoff <grothoff@gnunet.org> | 2023-11-09 21:48:07 +0100 |
---|---|---|
committer | Christian Grothoff <grothoff@gnunet.org> | 2023-11-09 21:48:07 +0100 |
commit | e8a77bdbac3cad62e018810c4c0cc06ba6c096b3 (patch) | |
tree | 09a6d2f0cfc15f998ff963718ad1f8ff5a118a93 /src | |
parent | 79c0d4adf09ac76302035e178d86c83dbe27097a (diff) |
recoup support for coin history
Diffstat (limited to 'src')
-rw-r--r-- | src/testing/testing_api_cmd_coin_history.c | 11 | ||||
-rw-r--r-- | src/testing/testing_api_cmd_recoup_refresh.c | 100 |
2 files changed, 105 insertions, 6 deletions
diff --git a/src/testing/testing_api_cmd_coin_history.c b/src/testing/testing_api_cmd_coin_history.c index 703465ab0..239037454 100644 --- a/src/testing/testing_api_cmd_coin_history.c +++ b/src/testing/testing_api_cmd_coin_history.c @@ -155,14 +155,15 @@ history_entry_cmp ( if (0 != GNUNET_memcmp (&h1->details.recoup_refresh.coin_sig, &h2->details.recoup_refresh.coin_sig)) return 1; - if (0 != GNUNET_memcmp (&h1->details.recoup_refresh.exchange_sig, - &h2->details.recoup_refresh.exchange_sig)) - return 1; + /* Note: exchange_sig, exchange_pub and timestamp are + fundamentally not available in the initiating command */ return 0; case TALER_EXCHANGE_CTT_OLD_COIN_RECOUP: - if (0 != GNUNET_memcmp (&h1->details.old_coin_recoup.exchange_sig, - &h2->details.old_coin_recoup.exchange_sig)) + if (0 != GNUNET_memcmp (&h1->details.old_coin_recoup.new_coin_pub, + &h2->details.old_coin_recoup.new_coin_pub)) return 1; + /* Note: exchange_sig, exchange_pub and timestamp are + fundamentally not available in the initiating command */ return 0; case TALER_EXCHANGE_CTT_PURSE_DEPOSIT: if (0 != GNUNET_memcmp (&h1->details.purse_deposit.coin_sig, diff --git a/src/testing/testing_api_cmd_recoup_refresh.c b/src/testing/testing_api_cmd_recoup_refresh.c index f2fc3b6ce..68d267be4 100644 --- a/src/testing/testing_api_cmd_recoup_refresh.c +++ b/src/testing/testing_api_cmd_recoup_refresh.c @@ -44,6 +44,26 @@ struct RecoupRefreshState const char *coin_reference; /** + * Entry in the old coin's history generated by this operation. + */ + struct TALER_EXCHANGE_CoinHistoryEntry che_old; + + /** + * Entry in the recouped coin's history generated by this operation. + */ + struct TALER_EXCHANGE_CoinHistoryEntry che_new; + + /** + * Public key of the refunded coin. + */ + struct TALER_CoinSpendPublicKeyP coin_pub_old; + + /** + * Public key of the refunded coin. + */ + struct TALER_CoinSpendPublicKeyP coin_pub_new; + + /** * Amount to be recouped. */ struct TALER_Amount amount; @@ -178,6 +198,7 @@ recoup_refresh_run (void *cls, const struct TALER_TESTING_Command *coin_cmd; const struct TALER_TESTING_Command *melt_cmd; const struct TALER_CoinSpendPrivateKeyP *coin_priv; + const struct TALER_CoinSpendPrivateKeyP *coin_priv_old; const struct TALER_EXCHANGE_DenomPublicKey *denom_pub; const struct TALER_DenominationSignature *coin_sig; const struct TALER_RefreshMasterSecretP *rplanchet; @@ -185,6 +206,7 @@ recoup_refresh_run (void *cls, const struct TALER_ExchangeWithdrawValues *ewv; char *cref; unsigned int idx; + struct TALER_DenominationHashP h_denom_pub; rrs->is = is; if (GNUNET_OK != @@ -224,6 +246,22 @@ recoup_refresh_run (void *cls, return; } if (GNUNET_OK != + TALER_TESTING_get_trait_coin_priv (melt_cmd, + 0, + &coin_priv_old)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + GNUNET_CRYPTO_eddsa_key_get_public ( + &coin_priv->eddsa_priv, + &rrs->coin_pub_new.eddsa_pub); + GNUNET_CRYPTO_eddsa_key_get_public ( + &coin_priv_old->eddsa_priv, + &rrs->coin_pub_old.eddsa_pub); + + if (GNUNET_OK != TALER_TESTING_get_trait_exchange_wd_value (melt_cmd, idx, &ewv)) @@ -270,6 +308,29 @@ recoup_refresh_run (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Trying to recoup_refresh denomination '%s'\n", TALER_B2S (&denom_pub->h_key)); + rrs->che_old.type + = TALER_EXCHANGE_CTT_OLD_COIN_RECOUP; + rrs->che_old.amount + = rrs->amount; + rrs->che_old.details.old_coin_recoup.new_coin_pub + = rrs->coin_pub_new; + rrs->che_new.type + = TALER_EXCHANGE_CTT_RECOUP_REFRESH; + rrs->che_new.amount + = rrs->amount; + rrs->che_new.details.recoup_refresh.old_coin_pub + = rrs->coin_pub_old; + TALER_planchet_blinding_secret_create ( + planchet, + ewv, + &rrs->che_new.details.recoup_refresh.coin_bks); + TALER_denom_pub_hash (&denom_pub->key, + &h_denom_pub); + TALER_wallet_recoup_refresh_sign ( + &h_denom_pub, + &rrs->che_new.details.recoup_refresh.coin_bks, + coin_priv, + &rrs->che_new.details.recoup_refresh.coin_sig); rrs->ph = TALER_EXCHANGE_recoup_refresh ( TALER_TESTING_interpreter_get_context (is), TALER_TESTING_get_exchange_url (is), @@ -307,6 +368,42 @@ recoup_refresh_cleanup (void *cls, } +/** + * Offer internal data from a "recoup-refresh" CMD state to other + * commands. + * + * @param cls closure + * @param[out] ret result (could be anything) + * @param trait name of the trait + * @param index index number of the object to offer. + * @return #GNUNET_OK on success + */ +static enum GNUNET_GenericReturnValue +recoup_refresh_traits (void *cls, + const void **ret, + const char *trait, + unsigned int index) +{ + struct RecoupRefreshState *rrs = cls; + struct TALER_TESTING_Trait traits[] = { + TALER_TESTING_make_trait_coin_history (0, + &rrs->che_old), + TALER_TESTING_make_trait_coin_pub (0, + &rrs->coin_pub_old), + TALER_TESTING_make_trait_coin_history (1, + &rrs->che_new), + TALER_TESTING_make_trait_coin_pub (1, + &rrs->coin_pub_new), + TALER_TESTING_trait_end () + }; + + return TALER_TESTING_get_trait (traits, + ret, + trait, + index); +} + + struct TALER_TESTING_Command TALER_TESTING_cmd_recoup_refresh (const char *label, unsigned int expected_response_code, @@ -335,7 +432,8 @@ TALER_TESTING_cmd_recoup_refresh (const char *label, .cls = rrs, .label = label, .run = &recoup_refresh_run, - .cleanup = &recoup_refresh_cleanup + .cleanup = &recoup_refresh_cleanup, + .traits = &recoup_refresh_traits }; return cmd; |