withdraw test prepared for age restriction

- TALER_TESTING_find_pk takes boolean age_restricted
- struct RefreshMeltState carries age commitment of melted coin
- melt_run calls TALER_age_commitment_derive, if necessary
This commit is contained in:
Özgür Kesim 2022-02-06 11:30:30 +01:00
parent e41c71f6ea
commit 5e93e244bd
Signed by: oec
GPG Key ID: 3D76A56D79EDD9D7
4 changed files with 48 additions and 15 deletions

View File

@ -66,11 +66,13 @@ TALER_TESTING_make_wire_details (const char *payto);
* *
* @param keys array of keys to search * @param keys array of keys to search
* @param amount coin value to look for * @param amount coin value to look for
* @param age_restricted must the denomination be age restricted?
* @return NULL if no matching key was found * @return NULL if no matching key was found
*/ */
const struct TALER_EXCHANGE_DenomPublicKey * const struct TALER_EXCHANGE_DenomPublicKey *
TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys, TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys,
const struct TALER_Amount *amount); const struct TALER_Amount *amount,
bool age_restricted);
/** /**

View File

@ -121,6 +121,11 @@ struct RefreshMeltState
*/ */
const struct TALER_CoinSpendPrivateKeyP *melt_priv; const struct TALER_CoinSpendPrivateKeyP *melt_priv;
/*
* Age commitment for the coin, NULL if not applicable.
*/
const struct TALER_AgeCommitment *age_commitment;
/** /**
* Task scheduled to try later. * Task scheduled to try later.
*/ */
@ -1048,8 +1053,9 @@ melt_run (void *cls,
TALER_TESTING_interpreter_fail (rms->is); TALER_TESTING_interpreter_fail (rms->is);
return; return;
} }
fresh_pk = TALER_TESTING_find_pk fresh_pk = TALER_TESTING_find_pk (TALER_EXCHANGE_get_keys (is->exchange),
(TALER_EXCHANGE_get_keys (is->exchange), &fresh_amount); &fresh_amount,
melt_denom_pub->age_restricted);
if (NULL == fresh_pk) if (NULL == fresh_pk)
{ {
GNUNET_break (0); GNUNET_break (0);
@ -1071,14 +1077,34 @@ melt_run (void *cls,
&fresh_pk->key); &fresh_pk->key);
} /* end for */ } /* end for */
GNUNET_assert (NULL == rms->refresh_data); GNUNET_assert (NULL == rms->refresh_data);
rms->refresh_data {
= TALER_EXCHANGE_refresh_prepare (rms->melt_priv, struct TALER_AgeCommitment *ac = NULL;
&melt_amount,
melt_sig, GNUNET_assert (melt_denom_pub->age_restricted ==
melt_denom_pub, (NULL != rms->age_commitment));
NULL, /* FIXME-oec */
num_fresh_coins, if (NULL != rms->age_commitment)
rms->fresh_pks); {
uint32_t seed = GNUNET_CRYPTO_random_u32 (
GNUNET_CRYPTO_QUALITY_WEAK,
UINT32_MAX);
GNUNET_assert (GNUNET_OK ==
TALER_age_commitment_derive (
rms->age_commitment,
seed,
ac));
}
rms->refresh_data
= TALER_EXCHANGE_refresh_prepare (rms->melt_priv,
&melt_amount,
melt_sig,
melt_denom_pub,
ac,
num_fresh_coins,
rms->fresh_pks);
}
if (NULL == rms->refresh_data) if (NULL == rms->refresh_data)
{ {
GNUNET_break (0); GNUNET_break (0);

View File

@ -415,7 +415,8 @@ withdraw_run (void *cls,
if (NULL == ws->pk) if (NULL == ws->pk)
{ {
dpk = TALER_TESTING_find_pk (TALER_EXCHANGE_get_keys (is->exchange), dpk = TALER_TESTING_find_pk (TALER_EXCHANGE_get_keys (is->exchange),
&ws->amount); &ws->amount,
false); /* FIXME- oec */
if (NULL == dpk) if (NULL == dpk)
{ {
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,

View File

@ -416,11 +416,13 @@ TALER_TESTING_prepare_exchange (const char *config_filename,
* *
* @param keys array of keys to search * @param keys array of keys to search
* @param amount coin value to look for * @param amount coin value to look for
* @param age_restricted must denomination support age restriction?
* @return NULL if no matching key was found * @return NULL if no matching key was found
*/ */
const struct TALER_EXCHANGE_DenomPublicKey * const struct TALER_EXCHANGE_DenomPublicKey *
TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys, TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys,
const struct TALER_Amount *amount) const struct TALER_Amount *amount,
bool age_restricted)
{ {
struct GNUNET_TIME_Timestamp now; struct GNUNET_TIME_Timestamp now;
struct TALER_EXCHANGE_DenomPublicKey *pk; struct TALER_EXCHANGE_DenomPublicKey *pk;
@ -437,7 +439,8 @@ TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys,
pk->valid_from)) && pk->valid_from)) &&
(GNUNET_TIME_timestamp_cmp (now, (GNUNET_TIME_timestamp_cmp (now,
<, <,
pk->withdraw_valid_until)) ) pk->withdraw_valid_until)) &&
(age_restricted == pk->age_restricted) )
return pk; return pk;
} }
/* do 2nd pass to check if expiration times are to blame for /* do 2nd pass to check if expiration times are to blame for
@ -453,7 +456,8 @@ TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys,
pk->valid_from) || pk->valid_from) ||
GNUNET_TIME_timestamp_cmp (now, GNUNET_TIME_timestamp_cmp (now,
>, >,
pk->withdraw_valid_until) ) ) pk->withdraw_valid_until) ) &&
(age_restricted == pk->age_restricted) )
{ {
GNUNET_log GNUNET_log
(GNUNET_ERROR_TYPE_WARNING, (GNUNET_ERROR_TYPE_WARNING,