[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-exchange] branch master updated: new blind signature logic bug fi
From: |
gnunet |
Subject: |
[taler-exchange] branch master updated: new blind signature logic bug fixes |
Date: |
Sat, 28 Oct 2023 01:50:29 +0200 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository exchange.
The following commit(s) were added to refs/heads/master by this push:
new 9c730063 new blind signature logic bug fixes
9c730063 is described below
commit 9c730063ee7f622a4908f7d78f618a3e24040fb2
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Sat Oct 28 01:50:26 2023 +0200
new blind signature logic bug fixes
---
src/include/taler_crypto_lib.h | 22 +++++++++++++++++++
src/lib/exchange_api_melt.c | 15 +++++++++++--
src/lib/exchange_api_refresh_common.c | 14 ++++++------
src/lib/exchange_api_refreshes_reveal.c | 13 ++++++++---
src/testing/testing_api_cmd_refresh.c | 21 ++++++++++--------
src/util/crypto_helper_rsa.c | 1 +
src/util/denom.c | 39 +++++++++++++++++++++++++++++++++
7 files changed, 104 insertions(+), 21 deletions(-)
diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h
index 82d73700..7ea44189 100644
--- a/src/include/taler_crypto_lib.h
+++ b/src/include/taler_crypto_lib.h
@@ -1351,6 +1351,19 @@ const struct TALER_ExchangeWithdrawValues *
TALER_denom_ewv_rsa_singleton (void);
+/**
+ * Make a (deep) copy of the given @a bi_src to
+ * @a bi_dst.
+ *
+ * @param[out] bi_dst target to copy to
+ * @param bi_src blinding input values to copy
+ */
+void
+TALER_denom_ewv_deep_copy (
+ struct TALER_ExchangeWithdrawValues *bi_dst,
+ const struct TALER_ExchangeWithdrawValues *bi_src);
+
+
/**
* Create private key for a Taler coin.
* @param ps planchet secret to derive coin priv key
@@ -1420,6 +1433,15 @@ void
TALER_denom_pub_free (struct TALER_DenominationPublicKey *denom_pub);
+/**
+ * Free internals of @a ewv, but not @a ewv itself.
+ *
+ * @param[in] ewv input values to free
+ */
+void
+TALER_denom_ewv_free (struct TALER_ExchangeWithdrawValues *ewv);
+
+
/**
* Free internals of @a denom_priv, but not @a denom_priv itself.
*
diff --git a/src/lib/exchange_api_melt.c b/src/lib/exchange_api_melt.c
index 90677276..24b06447 100644
--- a/src/lib/exchange_api_melt.c
+++ b/src/lib/exchange_api_melt.c
@@ -308,7 +308,13 @@ start_melt (struct TALER_EXCHANGE_MeltHandle *mh)
struct TALER_ExchangeWithdrawValues alg_values[mh->rd->fresh_pks_len];
for (unsigned int i = 0; i<mh->rd->fresh_pks_len; i++)
- alg_values[i] = mh->mbds[i].alg_value;
+ {
+ if (GNUNET_CRYPTO_BSA_RSA ==
+ mh->rd->fresh_pks[i].key.bsign_pub_key->cipher)
+ alg_values[i] = *TALER_denom_ewv_rsa_singleton ();
+ else
+ alg_values[i] = mh->mbds[i].alg_value;
+ }
if (GNUNET_OK !=
TALER_EXCHANGE_get_melt_data_ (&mh->rms,
mh->rd,
@@ -470,7 +476,8 @@ csr_cb (void *cls,
case GNUNET_CRYPTO_BSA_RSA:
break;
case GNUNET_CRYPTO_BSA_CS:
- *wv = csrr->details.ok.alg_values[nks_off];
+ TALER_denom_ewv_deep_copy (wv,
+ &csrr->details.ok.alg_values[nks_off]);
nks_off++;
break;
}
@@ -528,6 +535,8 @@ TALER_EXCHANGE_melt (
GNUNET_free (mh);
return NULL;
case GNUNET_CRYPTO_BSA_RSA:
+ TALER_denom_ewv_deep_copy (&mh->mbds[i].alg_value,
+ TALER_denom_ewv_rsa_singleton ());
break;
case GNUNET_CRYPTO_BSA_CS:
nks[nks_off].pk = fresh_pk;
@@ -568,6 +577,8 @@ TALER_EXCHANGE_melt (
void
TALER_EXCHANGE_melt_cancel (struct TALER_EXCHANGE_MeltHandle *mh)
{
+ for (unsigned int i = 0; i<mh->rd->fresh_pks_len; i++)
+ TALER_denom_ewv_free (&mh->mbds[i].alg_value);
if (NULL != mh->job)
{
GNUNET_CURL_job_cancel (mh->job);
diff --git a/src/lib/exchange_api_refresh_common.c
b/src/lib/exchange_api_refresh_common.c
index 2e92807b..652581d8 100644
--- a/src/lib/exchange_api_refresh_common.c
+++ b/src/lib/exchange_api_refresh_common.c
@@ -102,6 +102,13 @@ TALER_EXCHANGE_get_melt_data_ (
TALER_denom_pub_deep_copy (&fcd->fresh_pk,
&rd->fresh_pks[j].key);
GNUNET_assert (NULL != fcd->fresh_pk.bsign_pub_key);
+ if (alg_values[j].blinding_inputs->cipher !=
+ fcd->fresh_pk.bsign_pub_key->cipher)
+ {
+ GNUNET_break (0);
+ TALER_EXCHANGE_free_melt_data_ (md);
+ return GNUNET_SYSERR;
+ }
switch (fcd->fresh_pk.bsign_pub_key->cipher)
{
case GNUNET_CRYPTO_BSA_INVALID:
@@ -111,13 +118,6 @@ TALER_EXCHANGE_get_melt_data_ (
case GNUNET_CRYPTO_BSA_RSA:
break;
case GNUNET_CRYPTO_BSA_CS:
- if (alg_values[j].blinding_inputs->cipher !=
- fcd->fresh_pk.bsign_pub_key->cipher)
- {
- GNUNET_break (0);
- TALER_EXCHANGE_free_melt_data_ (md);
- return GNUNET_SYSERR;
- }
uses_cs = true;
TALER_cs_refresh_nonce_derive (rms,
j,
diff --git a/src/lib/exchange_api_refreshes_reveal.c
b/src/lib/exchange_api_refreshes_reveal.c
index a4ea4776..9161ac3d 100644
--- a/src/lib/exchange_api_refreshes_reveal.c
+++ b/src/lib/exchange_api_refreshes_reveal.c
@@ -420,6 +420,7 @@ TALER_EXCHANGE_refreshes_reveal (
for (size_t i = 0; i < rd->melt_age_commitment_proof->commitment.num; i++)
{
enum GNUNET_GenericReturnValue ret;
+
ret = json_array_append_new (
old_age_commitment,
GNUNET_JSON_from_data_auto (
@@ -470,9 +471,13 @@ TALER_EXCHANGE_refreshes_reveal (
rrh->reveal_cb_cls = reveal_cb_cls;
rrh->md = md;
rrh->alg_values
- = GNUNET_memdup (alg_values,
- md.num_fresh_coins
- * sizeof (struct TALER_ExchangeWithdrawValues));
+ = GNUNET_new_array (md.num_fresh_coins,
+ struct TALER_ExchangeWithdrawValues);
+ for (unsigned int i = 0; i<md.num_fresh_coins; i++)
+ {
+ TALER_denom_ewv_deep_copy (&rrh->alg_values[i],
+ &alg_values[i]);
+ }
rrh->url = TALER_url_join (url,
arg_str,
NULL);
@@ -521,6 +526,8 @@ TALER_EXCHANGE_refreshes_reveal_cancel (
GNUNET_CURL_job_cancel (rrh->job);
rrh->job = NULL;
}
+ for (unsigned int i = 0; i<rrh->md.num_fresh_coins; i++)
+ TALER_denom_ewv_free (&rrh->alg_values[i]);
GNUNET_free (rrh->alg_values);
GNUNET_free (rrh->url);
TALER_curl_easy_post_finished (&rrh->ctx);
diff --git a/src/testing/testing_api_cmd_refresh.c
b/src/testing/testing_api_cmd_refresh.c
index ac1a8559..c5e20f2a 100644
--- a/src/testing/testing_api_cmd_refresh.c
+++ b/src/testing/testing_api_cmd_refresh.c
@@ -964,10 +964,12 @@ melt_cb (void *cls,
return;
}
GNUNET_free (rms->mbds);
- rms->mbds = GNUNET_memdup (mr->details.ok.mbds,
- mr->details.ok.num_mbds
- * sizeof (struct
- TALER_EXCHANGE_MeltBlindingDetail));
+ rms->mbds = GNUNET_new_array (
+ mr->details.ok.num_mbds,
+ struct TALER_EXCHANGE_MeltBlindingDetail);
+ for (unsigned int i = 0; i<mr->details.ok.num_mbds; i++)
+ TALER_denom_ewv_deep_copy (&rms->mbds[i].alg_value,
+ &mr->details.ok.mbds[i].alg_value);
}
if (0 != rms->total_backoff.rel_value_us)
{
@@ -1059,7 +1061,6 @@ melt_run (void *cls,
TALER_TESTING_interpreter_fail (rms->is);
return;
}
-
if (GNUNET_OK !=
TALER_TESTING_get_trait_age_commitment_proof (coin_command,
0,
@@ -1079,7 +1080,6 @@ melt_run (void *cls,
TALER_TESTING_interpreter_fail (rms->is);
return;
}
-
if (GNUNET_OK !=
TALER_TESTING_get_trait_denom_sig (coin_command,
0,
@@ -1089,7 +1089,6 @@ melt_run (void *cls,
TALER_TESTING_interpreter_fail (rms->is);
return;
}
-
if (GNUNET_OK !=
TALER_TESTING_get_trait_denom_pub (coin_command,
0,
@@ -1217,8 +1216,12 @@ melt_cleanup (void *cls,
TALER_denom_pub_free (&rms->fresh_pks[i].key);
GNUNET_free (rms->fresh_pks);
}
-
- GNUNET_free (rms->mbds);
+ if (NULL != rms->mbds)
+ {
+ for (unsigned int i = 0; i < rms->num_fresh_coins; i++)
+ TALER_denom_ewv_free (&rms->mbds[i].alg_value);
+ GNUNET_free (rms->mbds);
+ }
GNUNET_free (rms->melt_fresh_amounts);
GNUNET_free (rms);
}
diff --git a/src/util/crypto_helper_rsa.c b/src/util/crypto_helper_rsa.c
index 7dd584aa..58ed5a37 100644
--- a/src/util/crypto_helper_rsa.c
+++ b/src/util/crypto_helper_rsa.c
@@ -776,6 +776,7 @@ more:
wpos);
blind_sig = GNUNET_new (struct GNUNET_CRYPTO_BlindedSignature);
blind_sig->cipher = GNUNET_CRYPTO_BSA_RSA;
+ blind_sig->rc = 1;
blind_sig->details.blinded_rsa_signature = rsa_signature;
bss[wpos].blinded_sig = blind_sig;
wpos++;
diff --git a/src/util/denom.c b/src/util/denom.c
index 50f191b2..7d24104b 100644
--- a/src/util/denom.c
+++ b/src/util/denom.c
@@ -31,6 +31,12 @@ TALER_denom_priv_create (struct TALER_DenominationPrivateKey
*denom_priv,
enum GNUNET_GenericReturnValue ret;
va_list ap;
+ memset (denom_pub,
+ 0,
+ sizeof (*denom_pub));
+ memset (denom_priv,
+ 0,
+ sizeof (*denom_priv));
va_start (ap,
cipher);
ret = GNUNET_CRYPTO_blind_sign_keys_create_va (
@@ -226,6 +232,39 @@ TALER_blinded_denom_sig_free (
}
+void
+TALER_denom_ewv_free (struct TALER_ExchangeWithdrawValues *ewv)
+{
+ if (ewv == TALER_denom_ewv_rsa_singleton ())
+ return;
+ if (ewv->blinding_inputs ==
+ TALER_denom_ewv_rsa_singleton ()->blinding_inputs)
+ {
+ ewv->blinding_inputs = NULL;
+ return;
+ }
+ if (NULL != ewv->blinding_inputs)
+ {
+ GNUNET_CRYPTO_blinding_input_values_decref (ewv->blinding_inputs);
+ ewv->blinding_inputs = NULL;
+ }
+}
+
+
+void
+TALER_denom_ewv_deep_copy (struct TALER_ExchangeWithdrawValues *bi_dst,
+ const struct TALER_ExchangeWithdrawValues *bi_src)
+{
+ if (bi_src == TALER_denom_ewv_rsa_singleton ())
+ {
+ *bi_dst = *bi_src;
+ return;
+ }
+ bi_dst->blinding_inputs
+ = GNUNET_CRYPTO_blinding_input_values_incref (bi_src->blinding_inputs);
+}
+
+
void
TALER_denom_pub_deep_copy (struct TALER_DenominationPublicKey *denom_dst,
const struct TALER_DenominationPublicKey *denom_src)
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [taler-exchange] branch master updated: new blind signature logic bug fixes,
gnunet <=