From 66abbcac3f9431862ec68cf8f85781b51f2633be Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 6 Feb 2022 19:44:05 +0100 Subject: -fix more FTBFS issues --- src/lib/exchange_api_csr.c | 2 +- src/lib/exchange_api_link.c | 15 +++- src/lib/exchange_api_refresh_common.c | 16 ++-- src/lib/exchange_api_refreshes_reveal.c | 59 ++++++++++----- src/lib/exchange_api_withdraw.c | 130 +++++++++++++++++--------------- 5 files changed, 132 insertions(+), 90 deletions(-) (limited to 'src/lib') diff --git a/src/lib/exchange_api_csr.c b/src/lib/exchange_api_csr.c index 542931b40..dc2a18c72 100644 --- a/src/lib/exchange_api_csr.c +++ b/src/lib/exchange_api_csr.c @@ -94,7 +94,7 @@ csr_ok (struct TALER_EXCHANGE_CsRHandle *csrh, struct TALER_ExchangeWithdrawValues alg_values[GNUNET_NZL (alen)]; struct TALER_EXCHANGE_CsRResponse csrr = { .hr = *hr, - .details.success.arg_values_len = alen, + .details.success.alg_values_len = alen, .details.success.alg_values = alg_values }; diff --git a/src/lib/exchange_api_link.c b/src/lib/exchange_api_link.c index 0a99679c3..ccc2d2648 100644 --- a/src/lib/exchange_api_link.c +++ b/src/lib/exchange_api_link.c @@ -105,6 +105,8 @@ parse_link_coin (const struct TALER_EXCHANGE_LinkHandle *lh, GNUNET_JSON_spec_end () }; struct TALER_TransferSecretP secret; + struct TALER_PlanchetSecretsP ps; + struct TALER_ExchangeWithdrawValues alg_values; /* parse reply */ if (GNUNET_OK != @@ -120,9 +122,16 @@ parse_link_coin (const struct TALER_EXCHANGE_LinkHandle *lh, &secret); TALER_planchet_setup_refresh (&secret, coin_num, - coin_priv, - &bks); - + &ps); + + // TODO: implement cipher handling + alg_values.cipher = TALER_DENOMINATION_RSA; + TALER_planchet_setup_coin_priv (&ps, + &alg_values, + coin_priv); + TALER_planchet_blinding_secret_create (&ps, + &alg_values, + &bks); /* extract coin and signature */ if (GNUNET_OK != TALER_denom_sig_unblind (sig, diff --git a/src/lib/exchange_api_refresh_common.c b/src/lib/exchange_api_refresh_common.c index 323993b4f..5580fb0f1 100644 --- a/src/lib/exchange_api_refresh_common.c +++ b/src/lib/exchange_api_refresh_common.c @@ -131,19 +131,25 @@ TALER_EXCHANGE_get_melt_data_ ( { struct TALER_PlanchetSecretsP *fc = &md->fresh_coins[i][j]; struct TALER_RefreshCoinData *rcd = &rce[i].new_coins[j]; - struct TALER_ExchangeWithdrawValues alg_values; struct TALER_PlanchetDetail pd; struct TALER_CoinPubHash c_hash; + struct TALER_CoinSpendPrivateKeyP coin_priv; + union TALER_DenominationBlindingKeyP bks; TALER_planchet_setup_refresh (&trans_sec[i], j, fc); - // TODO: implement cipher handling - alg_values.cipher = TALER_DENOMINATION_RSA; + TALER_planchet_setup_coin_priv (fc, + &alg_values[j], + &coin_priv); + TALER_planchet_blinding_secret_create (fc, + &alg_values[j], + &bks); if (GNUNET_OK != TALER_planchet_prepare (&md->fresh_pks[j], - &alg_values, - fc, + &alg_values[j], + &bks, + &coin_priv, &c_hash, &pd)) { diff --git a/src/lib/exchange_api_refreshes_reveal.c b/src/lib/exchange_api_refreshes_reveal.c index cdfb5140f..346a16e44 100644 --- a/src/lib/exchange_api_refreshes_reveal.c +++ b/src/lib/exchange_api_refreshes_reveal.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2015-2021 Taler Systems SA + Copyright (C) 2015-2022 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 published by the Free Software @@ -127,14 +127,14 @@ refresh_reveal_ok (struct TALER_EXCHANGE_RefreshesRevealHandle *rrh, GNUNET_JSON_parse_free (outer_spec); return GNUNET_SYSERR; } - if (rrh->md->num_fresh_coins != json_array_size (jsona)) + if (rrh->md.num_fresh_coins != json_array_size (jsona)) { /* Number of coins generated does not match our expectation */ GNUNET_break_op (0); GNUNET_JSON_parse_free (outer_spec); return GNUNET_SYSERR; } - for (unsigned int i = 0; imd->num_fresh_coins; i++) + for (unsigned int i = 0; imd.num_fresh_coins; i++) { const struct TALER_PlanchetSecretsP *fc; struct TALER_DenominationPublicKey *pk; @@ -149,9 +149,10 @@ refresh_reveal_ok (struct TALER_EXCHANGE_RefreshesRevealHandle *rrh, GNUNET_JSON_spec_end () }; struct TALER_FreshCoin coin; + union TALER_DenominationBlindingKeyP bks; - fc = &rrh->md->fresh_coins[rrh->noreveal_index][i]; - pk = &rrh->md->fresh_pks[i]; + fc = &rrh->md.fresh_coins[rrh->noreveal_index][i]; + pk = &rrh->md.fresh_pks[i]; jsonai = json_array_get (jsona, i); GNUNET_assert (NULL != jsonai); @@ -165,21 +166,27 @@ refresh_reveal_ok (struct TALER_EXCHANGE_RefreshesRevealHandle *rrh, return GNUNET_SYSERR; } + // TODO: implement cipher handling + alg_values.cipher = TALER_DENOMINATION_RSA; + TALER_planchet_setup_coin_priv (fc, + &alg_values, + &coin_privs[i]); + TALER_planchet_blinding_secret_create (fc, + &alg_values, + &bks); /* needed to verify the signature, and we didn't store it earlier, hence recomputing it here... */ - coin_privs[i] = fc->coin_priv; - GNUNET_CRYPTO_eddsa_key_get_public (&fc->coin_priv.eddsa_priv, + GNUNET_CRYPTO_eddsa_key_get_public (&coin_privs[i].eddsa_priv, &coin_pub.eddsa_pub); /* FIXME-Oec: Age commitment hash. */ TALER_coin_pub_hash (&coin_pub, NULL, /* FIXME-Oec */ &coin_hash); - // TODO: implement cipher handling - alg_values.cipher = TALER_DENOMINATION_RSA; if (GNUNET_OK != TALER_planchet_to_coin (pk, &blind_sig, - fc, + &bks, + &coin_privs[i], &coin_hash, &alg_values, &coin)) @@ -225,8 +232,8 @@ handle_refresh_reveal_finished (void *cls, break; case MHD_HTTP_OK: { - struct TALER_DenominationSignature sigs[rrh->md->num_fresh_coins]; - struct TALER_CoinSpendPrivateKeyP coin_privs[rrh->md->num_fresh_coins]; + struct TALER_DenominationSignature sigs[rrh->md.num_fresh_coins]; + struct TALER_CoinSpendPrivateKeyP coin_privs[rrh->md.num_fresh_coins]; enum GNUNET_GenericReturnValue ret; memset (sigs, @@ -245,12 +252,12 @@ handle_refresh_reveal_finished (void *cls, { rrh->reveal_cb (rrh->reveal_cb_cls, &hr, - rrh->md->num_fresh_coins, + rrh->md.num_fresh_coins, coin_privs, sigs); rrh->reveal_cb = NULL; } - for (unsigned int i = 0; imd->num_fresh_coins; i++) + for (unsigned int i = 0; imd.num_fresh_coins; i++) TALER_denom_sig_free (&sigs[i]); TALER_EXCHANGE_refreshes_reveal_cancel (rrh); return; @@ -322,6 +329,7 @@ TALER_EXCHANGE_refreshes_reveal ( struct MeltData md; struct TALER_TransferPublicKeyP transfer_pub; char arg_str[sizeof (struct TALER_RefreshCommitmentP) * 2 + 32]; + struct TALER_TransferSecretP ts; GNUNET_assert (num_coins == rd->fresh_pks_len); if (noreveal_index >= TALER_CNC_KAPPA) @@ -353,6 +361,9 @@ TALER_EXCHANGE_refreshes_reveal ( GNUNET_CRYPTO_ecdhe_key_get_public ( &md.melted_coin.transfer_priv[noreveal_index].ecdhe_priv, &transfer_pub.ecdhe_pub); + TALER_link_recover_transfer_secret (&transfer_pub, + &rd->melt_priv, + &ts); /* now new_denoms */ GNUNET_assert (NULL != (new_denoms_h = json_array ())); @@ -361,9 +372,11 @@ TALER_EXCHANGE_refreshes_reveal ( for (unsigned int i = 0; iexchange_vals[i], - &md.fresh_coins[noreveal_index][i], + &alg_values[i], + &bks, + &coin_priv, &c_hash, &pd)) { @@ -511,7 +533,6 @@ TALER_EXCHANGE_refreshes_reveal_cancel ( GNUNET_free (rrh->url); TALER_curl_easy_post_finished (&rrh->ctx); TALER_EXCHANGE_free_melt_data_ (&rrh->md); - GNUNET_free (rrh->exchange_vals); GNUNET_free (rrh); } diff --git a/src/lib/exchange_api_withdraw.c b/src/lib/exchange_api_withdraw.c index 024cc5020..94c6007d7 100644 --- a/src/lib/exchange_api_withdraw.c +++ b/src/lib/exchange_api_withdraw.c @@ -71,10 +71,10 @@ struct TALER_EXCHANGE_WithdrawHandle /** * blinding secret */ - union DenominationBlindingKeyP bks; + union TALER_DenominationBlindingKeyP bks; /** - * + * Private key of the coin we are withdrawing. */ struct TALER_CoinSpendPrivateKeyP priv; @@ -135,8 +135,9 @@ handle_reserve_withdraw_finished ( if (GNUNET_OK != TALER_planchet_to_coin (&wh->pk.key, blind_sig, - &wh-> - & wh->c_hash, + &wh->bks, + &wh->priv, + &wh->c_hash, &wh->alg_values, &fc)) { @@ -188,21 +189,33 @@ withdraw_cs_stage_two_callback (void *cls, const struct TALER_EXCHANGE_CsRResponse *csrr) { struct TALER_EXCHANGE_WithdrawHandle *wh = cls; + struct TALER_EXCHANGE_WithdrawResponse wr = { + .hr = csrr->hr + }; wh->csrh = NULL; - GNUNET_assert (TALER_DENOMINATION_CS == wh->pk.key.cipher); - switch (csrr->hr.http_status) { case MHD_HTTP_OK: - wh->alg_values.details.cs_values.r_pub = csrr->details.success.r_pubs; + if (1 != csrr->details.success.alg_values_len) + { + GNUNET_break (0); + wr.hr.http_status = 0; + break; + } + wh->alg_values = csrr->details.success.alg_values[0]; + TALER_planchet_setup_coin_priv (&wh->ps, + &wh->alg_values, + &wh->priv); TALER_planchet_blinding_secret_create (&wh->ps, - &wh->alg_values); + &wh->alg_values, + &wh->bks); if (GNUNET_OK != TALER_planchet_prepare (&wh->pk.key, &wh->alg_values, - &wh->ps, + &wh->bks, + &wh->priv, &wh->c_hash, &wh->pd)) { @@ -214,19 +227,13 @@ withdraw_cs_stage_two_callback (void *cls, wh->reserve_priv, &handle_reserve_withdraw_finished, wh); - break; + return; default: - { - // the CSR request went wrong -> serve response to the callback - struct TALER_EXCHANGE_WithdrawResponse wr = { - .hr = csrr->hr - }; - wh->cb (wh->cb_cls, - &wr); - TALER_EXCHANGE_withdraw_cancel (wh); - break; - } + break; } + wh->cb (wh->cb_cls, + &wr); + TALER_EXCHANGE_withdraw_cancel (wh); } @@ -235,7 +242,7 @@ TALER_EXCHANGE_withdraw ( struct TALER_EXCHANGE_Handle *exchange, const struct TALER_EXCHANGE_DenomPublicKey *pk, const struct TALER_ReservePrivateKeyP *reserve_priv, - struct TALER_PlanchetSecretsP *ps, + const struct TALER_PlanchetSecretsP *ps, TALER_EXCHANGE_WithdrawCallback res_cb, void *res_cb_cls) { @@ -248,56 +255,55 @@ TALER_EXCHANGE_withdraw ( wh->reserve_priv = reserve_priv; wh->ps = *ps; wh->pk = *pk; - wh->csrh = NULL; - TALER_denom_pub_deep_copy (&wh->pk.key, &pk->key); switch (pk->key.cipher) { case TALER_DENOMINATION_RSA: - wh->alg_values.cipher = TALER_DENOMINATION_RSA; - - TALER_planchet_setup_coin_priv (ps, &wh->alg_values, &wh->priv); - TALER_planchet_blinding_secret_create (ps, &wh->alg_values, &wh->bks); - - if (GNUNET_OK != - TALER_planchet_prepare (&pk->key, - &wh->alg_values, - &bks, - &priv, - &wh->c_hash, - &wh->pd)) { - GNUNET_break (0); - GNUNET_free (wh); - return NULL; + wh->alg_values.cipher = TALER_DENOMINATION_RSA; + TALER_planchet_setup_coin_priv (ps, + &wh->alg_values, + &wh->priv); + TALER_planchet_blinding_secret_create (ps, + &wh->alg_values, + &wh->bks); + if (GNUNET_OK != + TALER_planchet_prepare (&pk->key, + &wh->alg_values, + &wh->bks, + &wh->priv, + &wh->c_hash, + &wh->pd)) + { + GNUNET_break (0); + GNUNET_free (wh); + return NULL; + } + wh->wh2 = TALER_EXCHANGE_withdraw2 (exchange, + &wh->pd, + wh->reserve_priv, + &handle_reserve_withdraw_finished, + wh); + break; } - wh->wh2 = TALER_EXCHANGE_withdraw2 (exchange, - &wh->pd, - wh->reserve_priv, - &handle_reserve_withdraw_finished, - wh); - break; case TALER_DENOMINATION_CS: - wh->pd.blinded_planchet.cipher = TALER_DENOMINATION_CS; - - /** - * This part is a bit hacky.. - * due to the reason that Withdraw tests use the same private key coin to sign, - * the same Withdraw nonce will be derived. - * In a normal withdrawal TALER_cs_withdraw_nonce_derive is used. - * As a hacky solution, we generate the nonce here randomly. - */ - TALER_cs_withdraw_nonce_generate (&wh->pd.blinded_planchet.details. - cs_blinded_planchet.nonce); - wh->csrh = TALER_EXCHANGE_csr (exchange, - pk, - &wh->pd.blinded_planchet.details. - cs_blinded_planchet.nonce, - &withdraw_cs_stage_two_callback, - wh); - break; + { + struct TALER_EXCHANGE_NonceKey nk = { + .pk = pk, + }; + + wh->pd.blinded_planchet.cipher = TALER_DENOMINATION_CS; + TALER_cs_withdraw_nonce_derive (ps, + &nk.nonce); + wh->csrh = TALER_EXCHANGE_csr (exchange, + 1, /* "array" length */ + &nk, + &withdraw_cs_stage_two_callback, + wh); + break; + } default: GNUNET_break (0); GNUNET_free (wh); -- cgit v1.2.3