aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/exchange/taler-exchange-httpd_keys.c10
-rw-r--r--src/include/taler_crypto_lib.h10
-rw-r--r--src/util/crypto_helper_cs.c53
-rw-r--r--src/util/test_helper_cs.c107
4 files changed, 77 insertions, 103 deletions
diff --git a/src/exchange/taler-exchange-httpd_keys.c b/src/exchange/taler-exchange-httpd_keys.c
index 81ebf291b..bf55b1029 100644
--- a/src/exchange/taler-exchange-httpd_keys.c
+++ b/src/exchange/taler-exchange-httpd_keys.c
@@ -2473,7 +2473,6 @@ TEH_keys_denomination_cs_r_pub (const struct
{
struct TEH_KeyStateHandle *ksh;
struct HelperDenomination *hd;
- enum TALER_ErrorCode r_derive_ec;
ksh = TEH_keys_get_state ();
if (NULL == ksh)
@@ -2491,11 +2490,10 @@ TEH_keys_denomination_cs_r_pub (const struct
return TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE;
}
- *r_pub = TALER_CRYPTO_helper_cs_r_derive (ksh->helpers->csdh,
- &hd->h_details.h_cs,
- nonce,
- &r_derive_ec);
- return r_derive_ec;
+ return TALER_CRYPTO_helper_cs_r_derive (ksh->helpers->csdh,
+ &hd->h_details.h_cs,
+ nonce,
+ r_pub);
}
diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h
index df6dd732c..5e531d90c 100644
--- a/src/include/taler_crypto_lib.h
+++ b/src/include/taler_crypto_lib.h
@@ -1982,16 +1982,14 @@ TALER_CRYPTO_helper_cs_revoke (
* @param dh helper to process connection
* @param h_cs hash of the CS public key to revoke
* @param nonce witdhraw nonce
- * @param[out] ec set to the error code (or #TALER_EC_NONE on success)
- * @return R, the value inside the structure will be NULL on failure,
- * see @a ec for details about the failure
+ * @param[out] crp set to the pair of R values
+ * @return set to the error code (or #TALER_EC_NONE on success)
*/
-// FIXME: swap rval and ec!
-struct TALER_DenominationCSPublicRPairP
+enum TALER_ErrorCode
TALER_CRYPTO_helper_cs_r_derive (struct TALER_CRYPTO_CsDenominationHelper *dh,
const struct TALER_CsPubHashP *h_cs,
const struct TALER_CsNonce *nonce,
- enum TALER_ErrorCode *ec);
+ struct TALER_DenominationCSPublicRPairP *crp);
/**
diff --git a/src/util/crypto_helper_cs.c b/src/util/crypto_helper_cs.c
index f772c39f5..019d1902b 100644
--- a/src/util/crypto_helper_cs.c
+++ b/src/util/crypto_helper_cs.c
@@ -607,18 +607,17 @@ TALER_CRYPTO_helper_cs_revoke (
}
-struct TALER_DenominationCSPublicRPairP
+enum TALER_ErrorCode
TALER_CRYPTO_helper_cs_r_derive (struct TALER_CRYPTO_CsDenominationHelper *dh,
const struct TALER_CsPubHashP *h_cs,
const struct TALER_CsNonce *nonce,
- enum TALER_ErrorCode *ec)
+ struct TALER_DenominationCSPublicRPairP *crp)
{
- struct TALER_DenominationCSPublicRPairP r_pub;
+ enum TALER_ErrorCode ec = TALER_EC_INVALID;
- memset (&r_pub,
+ memset (crp,
0,
- sizeof (r_pub));
-
+ sizeof (*crp));
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Starting R derivation process\n");
if (GNUNET_OK !=
@@ -626,8 +625,7 @@ TALER_CRYPTO_helper_cs_r_derive (struct TALER_CRYPTO_CsDenominationHelper *dh,
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Failed to connect to helper\n");
- *ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE;
- return r_pub;
+ return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE;
}
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -649,8 +647,7 @@ TALER_CRYPTO_helper_cs_r_derive (struct TALER_CRYPTO_CsDenominationHelper *dh,
GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
"send");
do_disconnect (dh);
- *ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE;
- return r_pub;
+ return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE;
}
}
@@ -663,7 +660,6 @@ TALER_CRYPTO_helper_cs_r_derive (struct TALER_CRYPTO_CsDenominationHelper *dh,
= (const struct GNUNET_MessageHeader *) buf;
bool finished = false;
- *ec = TALER_EC_INVALID;
while (1)
{
uint16_t msize;
@@ -683,20 +679,19 @@ TALER_CRYPTO_helper_cs_r_derive (struct TALER_CRYPTO_CsDenominationHelper *dh,
{
GNUNET_assert (finished);
GNUNET_assert (0 == off);
- return r_pub;
+ return ec;
}
GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
"recv");
do_disconnect (dh);
- *ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE;
- break;
+ return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE;
}
if (0 == ret)
{
GNUNET_break (0 == off);
if (! finished)
- *ec = TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG;
- return r_pub;
+ return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG;
+ return ec;
}
off += ret;
more:
@@ -712,15 +707,13 @@ more:
{
GNUNET_break_op (0);
do_disconnect (dh);
- *ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
- goto end;
+ return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
}
if (finished)
{
GNUNET_break_op (0);
do_disconnect (dh);
- *ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
- goto end;
+ return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
}
{
const struct TALER_CRYPTO_RDeriveResponse *rdr =
@@ -728,9 +721,9 @@ more:
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Received R\n");
- *ec = TALER_EC_NONE;
finished = true;
- r_pub = rdr->r_pub;
+ ec = TALER_EC_NONE;
+ *crp = rdr->r_pub;
break;
}
case TALER_HELPER_CS_MT_RES_RDERIVE_FAILURE:
@@ -738,14 +731,13 @@ more:
{
GNUNET_break_op (0);
do_disconnect (dh);
- *ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
- goto end;
+ return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
}
{
const struct TALER_CRYPTO_RDeriveFailure *rdf =
(const struct TALER_CRYPTO_RDeriveFailure *) buf;
- *ec = (enum TALER_ErrorCode) ntohl (rdf->ec);
+ ec = (enum TALER_ErrorCode) ntohl (rdf->ec);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"R derivation failed!\n");
finished = true;
@@ -760,8 +752,7 @@ more:
{
GNUNET_break_op (0);
do_disconnect (dh);
- *ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
- goto end;
+ return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
}
break; /* while(1) loop ensures we recvfrom() again */
case TALER_HELPER_CS_MT_PURGE:
@@ -773,8 +764,7 @@ more:
{
GNUNET_break_op (0);
do_disconnect (dh);
- *ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
- goto end;
+ return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
}
break; /* while(1) loop ensures we recvfrom() again */
case TALER_HELPER_CS_SYNCED:
@@ -788,8 +778,7 @@ more:
"Received unexpected message of type %u\n",
ntohs (hdr->type));
do_disconnect (dh);
- *ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
- goto end;
+ return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
}
memmove (buf,
&buf[msize],
@@ -797,8 +786,6 @@ more:
off -= msize;
goto more;
} /* while(1) */
-end:
- return r_pub;
}
}
diff --git a/src/util/test_helper_cs.c b/src/util/test_helper_cs.c
index 562cd16bf..dd807b254 100644
--- a/src/util/test_helper_cs.c
+++ b/src/util/test_helper_cs.c
@@ -273,38 +273,28 @@ test_r_derive (struct TALER_CRYPTO_CsDenominationHelper *dh)
struct TALER_ExchangeWithdrawValues alg_values;
TALER_planchet_master_setup_random (&ps);
- alg_values.cipher = TALER_DENOMINATION_CS;
- TALER_planchet_setup_coin_priv (&ps,
- &alg_values,
- &coin_priv);
- TALER_planchet_blinding_secret_create (&ps,
- &alg_values,
- &bks);
for (unsigned int i = 0; i<MAX_KEYS; i++)
{
struct TALER_PlanchetDetail pd;
+
if (! keys[i].valid)
continue;
// TODO: insert assertion into other checks
- GNUNET_assert (TALER_DENOMINATION_CS == keys[i].denom_pub.cipher);
- {
- pd.blinded_planchet.cipher = TALER_DENOMINATION_CS;
-
- TALER_cs_withdraw_nonce_derive (&ps,
- &pd.blinded_planchet.details.
- cs_blinded_planchet.nonce);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Requesting R derivation with key %s\n",
- GNUNET_h2s (&keys[i].h_cs.hash));
-
- alg_values.details.cs_values
- = TALER_CRYPTO_helper_cs_r_derive (dh,
- &keys[i].h_cs,
- &pd.blinded_planchet.
- details.
- cs_blinded_planchet.nonce,
- &ec);
- }
+ GNUNET_assert (TALER_DENOMINATION_CS ==
+ keys[i].denom_pub.cipher);
+ pd.blinded_planchet.cipher = TALER_DENOMINATION_CS;
+ TALER_cs_withdraw_nonce_derive (
+ &ps,
+ &pd.blinded_planchet.details.cs_blinded_planchet.nonce);
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Requesting R derivation with key %s\n",
+ GNUNET_h2s (&keys[i].h_cs.hash));
+ alg_values.cipher = TALER_DENOMINATION_CS;
+ ec = TALER_CRYPTO_helper_cs_r_derive (
+ dh,
+ &keys[i].h_cs,
+ &pd.blinded_planchet.details.cs_blinded_planchet.nonce,
+ &alg_values.details.cs_values);
switch (ec)
{
case TALER_EC_NONE:
@@ -330,7 +320,9 @@ test_r_derive (struct TALER_CRYPTO_CsDenominationHelper *dh)
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Received valid R for key %s\n",
GNUNET_h2s (&keys[i].h_cs.hash));
-
+ TALER_planchet_setup_coin_priv (&ps,
+ &alg_values,
+ &coin_priv);
TALER_planchet_blinding_secret_create (&ps,
&alg_values,
&bks);
@@ -381,6 +373,7 @@ test_r_derive (struct TALER_CRYPTO_CsDenominationHelper *dh)
{
struct TALER_CsPubHashP rnd;
struct TALER_CsNonce nonce;
+ struct TALER_DenominationCSPublicRPairP crp;
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
&rnd,
@@ -388,10 +381,10 @@ test_r_derive (struct TALER_CRYPTO_CsDenominationHelper *dh)
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
&nonce,
sizeof (nonce));
- TALER_CRYPTO_helper_cs_r_derive (dh,
- &rnd,
- &nonce,
- &ec);
+ ec = TALER_CRYPTO_helper_cs_r_derive (dh,
+ &rnd,
+ &nonce,
+ &crp);
if (TALER_EC_EXCHANGE_GENERIC_DENOMINATION_KEY_UNKNOWN != ec)
{
GNUNET_break (0);
@@ -424,29 +417,31 @@ test_signing (struct TALER_CRYPTO_CsDenominationHelper *dh)
struct TALER_ExchangeWithdrawValues alg_values;
TALER_planchet_master_setup_random (&ps);
- alg_values.cipher = TALER_DENOMINATION_CS;
- TALER_planchet_setup_coin_priv (&ps, &alg_values, &coin_priv);
- TALER_planchet_blinding_secret_create (&ps, &alg_values, &bks);
-
for (unsigned int i = 0; i<MAX_KEYS; i++)
{
if (! keys[i].valid)
continue;
{
struct TALER_PlanchetDetail pd;
+
pd.blinded_planchet.cipher = TALER_DENOMINATION_CS;
// keys[i].denom_pub.cipher = TALER_DENOMINATION_CS;
TALER_cs_withdraw_nonce_derive (&ps,
&pd.blinded_planchet.details.
cs_blinded_planchet.nonce);
- alg_values.details.cs_values
- = TALER_CRYPTO_helper_cs_r_derive (dh,
- &keys[i].h_cs,
- &pd.blinded_planchet.
- details.
- cs_blinded_planchet.nonce,
- &ec);
+ alg_values.cipher = TALER_DENOMINATION_CS;
+ ec = TALER_CRYPTO_helper_cs_r_derive (dh,
+ &keys[i].h_cs,
+ &pd.blinded_planchet.
+ details.
+ cs_blinded_planchet.nonce,
+ &alg_values.details.cs_values);
+ if (TALER_EC_NONE != ec)
+ continue;
+ TALER_planchet_setup_coin_priv (&ps,
+ &alg_values,
+ &coin_priv);
TALER_planchet_blinding_secret_create (&ps,
&alg_values,
&bks);
@@ -596,13 +591,6 @@ perf_signing (struct TALER_CRYPTO_CsDenominationHelper *dh,
struct TALER_ExchangeWithdrawValues alg_values;
TALER_planchet_master_setup_random (&ps);
- alg_values.cipher = TALER_DENOMINATION_CS;
- TALER_planchet_setup_coin_priv (&ps,
- &alg_values,
- &coin_priv);
- TALER_planchet_blinding_secret_create (&ps,
- &alg_values,
- &bks);
duration = GNUNET_TIME_UNIT_ZERO;
TALER_CRYPTO_helper_cs_poll (dh);
for (unsigned int j = 0; j<NUM_SIGN_PERFS;)
@@ -629,18 +617,21 @@ perf_signing (struct TALER_CRYPTO_CsDenominationHelper *dh,
TALER_cs_withdraw_nonce_derive (&ps,
&pd.blinded_planchet.details.
cs_blinded_planchet.nonce);
-
- alg_values.details.cs_values
- = TALER_CRYPTO_helper_cs_r_derive (dh,
- &keys[i].h_cs,
- &pd.blinded_planchet.
- details.
- cs_blinded_planchet.nonce,
- &ec);
+ alg_values.cipher = TALER_DENOMINATION_CS;
+ ec = TALER_CRYPTO_helper_cs_r_derive (dh,
+ &keys[i].h_cs,
+ &pd.blinded_planchet.
+ details.
+ cs_blinded_planchet.nonce,
+ &alg_values.details.cs_values);
+ if (TALER_EC_NONE != ec)
+ continue;
+ TALER_planchet_setup_coin_priv (&ps,
+ &alg_values,
+ &coin_priv);
TALER_planchet_blinding_secret_create (&ps,
&alg_values,
&bks);
-
GNUNET_assert (GNUNET_YES ==
TALER_planchet_prepare (&keys[i].denom_pub,
&alg_values,