-initial file for testing age-withdraw, not functional yet
This commit is contained in:
parent
fde760aef0
commit
c8250cae25
155
src/testing/testing_api_cmd_age_withdraw.c
Normal file
155
src/testing/testing_api_cmd_age_withdraw.c
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
/*
|
||||||
|
This file is part of TALER
|
||||||
|
Copyright (C) 2023 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 Foundation; either version 3, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
TALER is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public
|
||||||
|
License along with TALER; see the file COPYING. If not, see
|
||||||
|
<http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @file testing/testing_api_cmd_age_withdraw.c
|
||||||
|
* @brief implements the age-withdraw command
|
||||||
|
* @author Özgür Kesim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "platform.h"
|
||||||
|
#include "taler_json_lib.h"
|
||||||
|
#include <microhttpd.h>
|
||||||
|
#include <gnunet/gnunet_curl_lib.h>
|
||||||
|
#include "taler_signatures.h"
|
||||||
|
#include "taler_extensions.h"
|
||||||
|
#include "taler_testing_lib.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* State for a "age withdraw" CMD:
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct AgeWithdrawState
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Which reserve should we withdraw from?
|
||||||
|
*/
|
||||||
|
const char *reserve_reference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expected HTTP response code to the request.
|
||||||
|
*/
|
||||||
|
unsigned int expected_response_code;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum age we commit to
|
||||||
|
*/
|
||||||
|
uint8_t max_age;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of coins to withdraw
|
||||||
|
*/
|
||||||
|
size_t num_coins;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct TALER_TESTING_Command
|
||||||
|
TALER_TESTING_cmd_age_withdraw (const char *label,
|
||||||
|
const char *reserve_reference,
|
||||||
|
uint8_t max_age,
|
||||||
|
unsigned int expected_response_code,
|
||||||
|
const char *amount,
|
||||||
|
...)
|
||||||
|
{
|
||||||
|
struct AgeWithdrawState *aws;
|
||||||
|
unsigned int cnt;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
aws = GNUNET_new (struct AgeWithdrawState);
|
||||||
|
aws->max_age = max_age;
|
||||||
|
aws->reserve_reference = reserve_reference;
|
||||||
|
aws->expected_response_code = expected_response_code;
|
||||||
|
|
||||||
|
cnt = 1;
|
||||||
|
va_start (ap, amount);
|
||||||
|
while (NULL != (va_arg (ap, const char *)))
|
||||||
|
cnt++;
|
||||||
|
aws->num_coins = cnt;
|
||||||
|
aws->coins = GNUNET_new_array (cnt,
|
||||||
|
struct CoinState);
|
||||||
|
va_end (ap);
|
||||||
|
va_start (ap, amount);
|
||||||
|
for (unsigned int i = 0; i<ws->num_coins; i++)
|
||||||
|
{
|
||||||
|
struct CoinState *cs = &ws->coins[i];
|
||||||
|
|
||||||
|
if (0 < age)
|
||||||
|
{
|
||||||
|
struct TALER_AgeCommitmentProof *acp;
|
||||||
|
struct TALER_AgeCommitmentHash *hac;
|
||||||
|
struct GNUNET_HashCode seed;
|
||||||
|
struct TALER_AgeMask mask;
|
||||||
|
|
||||||
|
acp = GNUNET_new (struct TALER_AgeCommitmentProof);
|
||||||
|
hac = GNUNET_new (struct TALER_AgeCommitmentHash);
|
||||||
|
mask = TALER_extensions_get_age_restriction_mask ();
|
||||||
|
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
|
||||||
|
&seed,
|
||||||
|
sizeof(seed));
|
||||||
|
|
||||||
|
if (GNUNET_OK !=
|
||||||
|
TALER_age_restriction_commit (
|
||||||
|
&mask,
|
||||||
|
age,
|
||||||
|
&seed,
|
||||||
|
acp))
|
||||||
|
{
|
||||||
|
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||||
|
"Failed to generate age commitment for age %d at %s\n",
|
||||||
|
age,
|
||||||
|
label);
|
||||||
|
GNUNET_assert (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TALER_age_commitment_hash (&acp->commitment,
|
||||||
|
hac);
|
||||||
|
cs->age_commitment_proof = acp;
|
||||||
|
cs->h_age_commitment = hac;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GNUNET_OK !=
|
||||||
|
TALER_string_to_amount (amount,
|
||||||
|
&cs->amount))
|
||||||
|
{
|
||||||
|
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||||
|
"Failed to parse amount `%s' at %s\n",
|
||||||
|
amount,
|
||||||
|
label);
|
||||||
|
GNUNET_assert (0);
|
||||||
|
}
|
||||||
|
/* move on to next vararg! */
|
||||||
|
amount = va_arg (ap, const char *);
|
||||||
|
}
|
||||||
|
GNUNET_assert (NULL == amount);
|
||||||
|
va_end (ap);
|
||||||
|
|
||||||
|
{
|
||||||
|
struct TALER_TESTING_Command cmd = {
|
||||||
|
.cls = ws,
|
||||||
|
.label = label,
|
||||||
|
.run = &batch_withdraw_run,
|
||||||
|
.cleanup = &batch_withdraw_cleanup,
|
||||||
|
.traits = &batch_withdraw_traits
|
||||||
|
};
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* end of testing_api_cmd_age_withdraw.c */
|
Loading…
Reference in New Issue
Block a user