fix #3726
This commit is contained in:
parent
2d55a7bb61
commit
3991cd1763
@ -489,7 +489,6 @@ TMH_DB_execute_withdraw_sign (struct MHD_Connection *connection,
|
|||||||
* @param session the database connection
|
* @param session the database connection
|
||||||
* @param key_state the mint's key state
|
* @param key_state the mint's key state
|
||||||
* @param session_hash hash identifying the refresh session
|
* @param session_hash hash identifying the refresh session
|
||||||
* @param coin_public_info the coin to melt
|
|
||||||
* @param coin_details details about the coin being melted
|
* @param coin_details details about the coin being melted
|
||||||
* @param oldcoin_index what is the number assigned to this coin
|
* @param oldcoin_index what is the number assigned to this coin
|
||||||
* @return #GNUNET_OK on success,
|
* @return #GNUNET_OK on success,
|
||||||
@ -501,7 +500,6 @@ refresh_accept_melts (struct MHD_Connection *connection,
|
|||||||
struct TALER_MINTDB_Session *session,
|
struct TALER_MINTDB_Session *session,
|
||||||
const struct TMH_KS_StateHandle *key_state,
|
const struct TMH_KS_StateHandle *key_state,
|
||||||
const struct GNUNET_HashCode *session_hash,
|
const struct GNUNET_HashCode *session_hash,
|
||||||
const struct TALER_CoinPublicInfo *coin_public_info,
|
|
||||||
const struct TMH_DB_MeltDetails *coin_details,
|
const struct TMH_DB_MeltDetails *coin_details,
|
||||||
uint16_t oldcoin_index)
|
uint16_t oldcoin_index)
|
||||||
{
|
{
|
||||||
@ -514,15 +512,15 @@ refresh_accept_melts (struct MHD_Connection *connection,
|
|||||||
int res;
|
int res;
|
||||||
|
|
||||||
dki = &TMH_KS_denomination_key_lookup (key_state,
|
dki = &TMH_KS_denomination_key_lookup (key_state,
|
||||||
&coin_public_info->denom_pub)->issue;
|
&coin_details->coin_info.denom_pub)->issue;
|
||||||
|
|
||||||
if (NULL == dki)
|
if (NULL == dki)
|
||||||
return (MHD_YES ==
|
return (MHD_YES ==
|
||||||
TMH_RESPONSE_reply_json_pack (connection,
|
TMH_RESPONSE_reply_json_pack (connection,
|
||||||
MHD_HTTP_NOT_FOUND,
|
MHD_HTTP_NOT_FOUND,
|
||||||
"{s:s}",
|
"{s:s}",
|
||||||
"error",
|
"error",
|
||||||
"denom not found"))
|
"denom not found"))
|
||||||
? GNUNET_NO : GNUNET_SYSERR;
|
? GNUNET_NO : GNUNET_SYSERR;
|
||||||
|
|
||||||
TALER_amount_ntoh (&coin_value,
|
TALER_amount_ntoh (&coin_value,
|
||||||
@ -531,8 +529,8 @@ refresh_accept_melts (struct MHD_Connection *connection,
|
|||||||
spent = coin_details->melt_amount_with_fee;
|
spent = coin_details->melt_amount_with_fee;
|
||||||
/* add historic transaction costs of this coin */
|
/* add historic transaction costs of this coin */
|
||||||
tl = TMH_plugin->get_coin_transactions (TMH_plugin->cls,
|
tl = TMH_plugin->get_coin_transactions (TMH_plugin->cls,
|
||||||
session,
|
session,
|
||||||
&coin_public_info->coin_pub);
|
&coin_details->coin_info.coin_pub);
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
calculate_transaction_list_totals (tl,
|
calculate_transaction_list_totals (tl,
|
||||||
&spent,
|
&spent,
|
||||||
@ -540,7 +538,7 @@ refresh_accept_melts (struct MHD_Connection *connection,
|
|||||||
{
|
{
|
||||||
GNUNET_break (0);
|
GNUNET_break (0);
|
||||||
TMH_plugin->free_coin_transaction_list (TMH_plugin->cls,
|
TMH_plugin->free_coin_transaction_list (TMH_plugin->cls,
|
||||||
tl);
|
tl);
|
||||||
return TMH_RESPONSE_reply_internal_db_error (connection);
|
return TMH_RESPONSE_reply_internal_db_error (connection);
|
||||||
}
|
}
|
||||||
/* Refuse to refresh when the coin's value is insufficient
|
/* Refuse to refresh when the coin's value is insufficient
|
||||||
@ -554,28 +552,28 @@ refresh_accept_melts (struct MHD_Connection *connection,
|
|||||||
&coin_details->melt_amount_with_fee));
|
&coin_details->melt_amount_with_fee));
|
||||||
res = (MHD_YES ==
|
res = (MHD_YES ==
|
||||||
TMH_RESPONSE_reply_refresh_melt_insufficient_funds (connection,
|
TMH_RESPONSE_reply_refresh_melt_insufficient_funds (connection,
|
||||||
&coin_public_info->coin_pub,
|
&coin_details->coin_info.coin_pub,
|
||||||
coin_value,
|
coin_value,
|
||||||
tl,
|
tl,
|
||||||
coin_details->melt_amount_with_fee,
|
coin_details->melt_amount_with_fee,
|
||||||
coin_residual))
|
coin_residual))
|
||||||
? GNUNET_NO : GNUNET_SYSERR;
|
? GNUNET_NO : GNUNET_SYSERR;
|
||||||
TMH_plugin->free_coin_transaction_list (TMH_plugin->cls,
|
TMH_plugin->free_coin_transaction_list (TMH_plugin->cls,
|
||||||
tl);
|
tl);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
TMH_plugin->free_coin_transaction_list (TMH_plugin->cls,
|
TMH_plugin->free_coin_transaction_list (TMH_plugin->cls,
|
||||||
tl);
|
tl);
|
||||||
|
|
||||||
melt.coin = *coin_public_info;
|
melt.coin = coin_details->coin_info;
|
||||||
melt.coin_sig = coin_details->melt_sig;
|
melt.coin_sig = coin_details->melt_sig;
|
||||||
melt.session_hash = *session_hash;
|
melt.session_hash = *session_hash;
|
||||||
melt.amount_with_fee = coin_details->melt_amount_with_fee;
|
melt.amount_with_fee = coin_details->melt_amount_with_fee;
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
TMH_plugin->insert_refresh_melt (TMH_plugin->cls,
|
TMH_plugin->insert_refresh_melt (TMH_plugin->cls,
|
||||||
session,
|
session,
|
||||||
oldcoin_index,
|
oldcoin_index,
|
||||||
&melt))
|
&melt))
|
||||||
{
|
{
|
||||||
GNUNET_break (0);
|
GNUNET_break (0);
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
@ -595,8 +593,7 @@ refresh_accept_melts (struct MHD_Connection *connection,
|
|||||||
* @param session_hash hash code of the session the coins are melted into
|
* @param session_hash hash code of the session the coins are melted into
|
||||||
* @param num_new_denoms number of entries in @a denom_pubs, size of y-dimension of @a commit_coin array
|
* @param num_new_denoms number of entries in @a denom_pubs, size of y-dimension of @a commit_coin array
|
||||||
* @param denom_pubs public keys of the coins we want to withdraw in the end
|
* @param denom_pubs public keys of the coins we want to withdraw in the end
|
||||||
* @param coin_count number of entries in @a coin_public_infos and @a coin_melt_details, size of y-dimension of @a commit_link array
|
* @param coin_count number of entries in @a coin_melt_details, size of y-dimension of @a commit_link array
|
||||||
* @param coin_public_infos information about the coins to melt
|
|
||||||
* @param coin_melt_details signatures and (residual) value of the respective coin should be melted
|
* @param coin_melt_details signatures and (residual) value of the respective coin should be melted
|
||||||
* @param commit_coin 2d array of coin commitments (what the mint is to sign
|
* @param commit_coin 2d array of coin commitments (what the mint is to sign
|
||||||
* once the "/refres/reveal" of cut and choose is done),
|
* once the "/refres/reveal" of cut and choose is done),
|
||||||
@ -613,7 +610,6 @@ TMH_DB_execute_refresh_melt (struct MHD_Connection *connection,
|
|||||||
unsigned int num_new_denoms,
|
unsigned int num_new_denoms,
|
||||||
const struct TALER_DenominationPublicKey *denom_pubs,
|
const struct TALER_DenominationPublicKey *denom_pubs,
|
||||||
unsigned int coin_count,
|
unsigned int coin_count,
|
||||||
const struct TALER_CoinPublicInfo *coin_public_infos,
|
|
||||||
const struct TMH_DB_MeltDetails *coin_melt_details,
|
const struct TMH_DB_MeltDetails *coin_melt_details,
|
||||||
struct TALER_MINTDB_RefreshCommitCoin *const* commit_coin,
|
struct TALER_MINTDB_RefreshCommitCoin *const* commit_coin,
|
||||||
struct TALER_MINTDB_RefreshCommitLinkP *const* commit_link)
|
struct TALER_MINTDB_RefreshCommitLinkP *const* commit_link)
|
||||||
@ -624,9 +620,10 @@ TMH_DB_execute_refresh_melt (struct MHD_Connection *connection,
|
|||||||
int res;
|
int res;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls,
|
if (NULL ==
|
||||||
GNUNET_NO)))
|
(session = TMH_plugin->get_session (TMH_plugin->cls,
|
||||||
{
|
GNUNET_NO)))
|
||||||
|
{
|
||||||
GNUNET_break (0);
|
GNUNET_break (0);
|
||||||
return TMH_RESPONSE_reply_internal_db_error (connection);
|
return TMH_RESPONSE_reply_internal_db_error (connection);
|
||||||
}
|
}
|
||||||
@ -638,16 +635,16 @@ TMH_DB_execute_refresh_melt (struct MHD_Connection *connection,
|
|||||||
return TMH_RESPONSE_reply_internal_db_error (connection);
|
return TMH_RESPONSE_reply_internal_db_error (connection);
|
||||||
}
|
}
|
||||||
res = TMH_plugin->get_refresh_session (TMH_plugin->cls,
|
res = TMH_plugin->get_refresh_session (TMH_plugin->cls,
|
||||||
session,
|
session,
|
||||||
session_hash,
|
session_hash,
|
||||||
&refresh_session);
|
&refresh_session);
|
||||||
if (GNUNET_YES == res)
|
if (GNUNET_YES == res)
|
||||||
{
|
{
|
||||||
TMH_plugin->rollback (TMH_plugin->cls,
|
TMH_plugin->rollback (TMH_plugin->cls,
|
||||||
session);
|
session);
|
||||||
res = TMH_RESPONSE_reply_refresh_melt_success (connection,
|
res = TMH_RESPONSE_reply_refresh_melt_success (connection,
|
||||||
session_hash,
|
session_hash,
|
||||||
refresh_session.noreveal_index);
|
refresh_session.noreveal_index);
|
||||||
return (GNUNET_SYSERR == res) ? MHD_NO : MHD_YES;
|
return (GNUNET_SYSERR == res) ? MHD_NO : MHD_YES;
|
||||||
}
|
}
|
||||||
if (GNUNET_SYSERR == res)
|
if (GNUNET_SYSERR == res)
|
||||||
@ -666,7 +663,6 @@ TMH_DB_execute_refresh_melt (struct MHD_Connection *connection,
|
|||||||
session,
|
session,
|
||||||
key_state,
|
key_state,
|
||||||
session_hash,
|
session_hash,
|
||||||
&coin_public_infos[i],
|
|
||||||
&coin_melt_details[i],
|
&coin_melt_details[i],
|
||||||
i)))
|
i)))
|
||||||
{
|
{
|
||||||
|
@ -83,6 +83,12 @@ TMH_DB_execute_withdraw_sign (struct MHD_Connection *connection,
|
|||||||
*/
|
*/
|
||||||
struct TMH_DB_MeltDetails
|
struct TMH_DB_MeltDetails
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information about the coin being melted.
|
||||||
|
*/
|
||||||
|
struct TALER_CoinPublicInfo coin_info;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signature allowing the melt (using
|
* Signature allowing the melt (using
|
||||||
* a `struct TALER_MINTDB_RefreshMeltConfirmSignRequestBody`) to sign over.
|
* a `struct TALER_MINTDB_RefreshMeltConfirmSignRequestBody`) to sign over.
|
||||||
@ -109,9 +115,8 @@ struct TMH_DB_MeltDetails
|
|||||||
* @param session_hash hash code of the session the coins are melted into
|
* @param session_hash hash code of the session the coins are melted into
|
||||||
* @param num_new_denoms number of entries in @a denom_pubs, size of y-dimension of @a commit_coin array
|
* @param num_new_denoms number of entries in @a denom_pubs, size of y-dimension of @a commit_coin array
|
||||||
* @param denom_pubs array of public denomination keys for the refresh (?)
|
* @param denom_pubs array of public denomination keys for the refresh (?)
|
||||||
* @param coin_count number of entries in @a coin_public_infos and @ a coin_melt_details, size of y-dimension of @a commit_link array
|
* @param coin_count number of entries in @ a coin_melt_details, size of y-dimension of @a commit_link array
|
||||||
* @param coin_public_infos information about the coins to melt
|
* @param coin_melt_details signatures and (residual) value of and information about the respective coin to be melted
|
||||||
* @param coin_melt_details signatures and (residual) value of the respective coin should be melted
|
|
||||||
* @param commit_coin 2d array of coin commitments (what the mint is to sign
|
* @param commit_coin 2d array of coin commitments (what the mint is to sign
|
||||||
* once the "/refres/reveal" of cut and choose is done)
|
* once the "/refres/reveal" of cut and choose is done)
|
||||||
* @param commit_link 2d array of coin link commitments (what the mint is
|
* @param commit_link 2d array of coin link commitments (what the mint is
|
||||||
@ -125,7 +130,6 @@ TMH_DB_execute_refresh_melt (struct MHD_Connection *connection,
|
|||||||
unsigned int num_new_denoms,
|
unsigned int num_new_denoms,
|
||||||
const struct TALER_DenominationPublicKey *denom_pubs,
|
const struct TALER_DenominationPublicKey *denom_pubs,
|
||||||
unsigned int coin_count,
|
unsigned int coin_count,
|
||||||
const struct TALER_CoinPublicInfo *coin_public_infos,
|
|
||||||
const struct TMH_DB_MeltDetails *coin_melt_details,
|
const struct TMH_DB_MeltDetails *coin_melt_details,
|
||||||
struct TALER_MINTDB_RefreshCommitCoin *const* commit_coin,
|
struct TALER_MINTDB_RefreshCommitCoin *const* commit_coin,
|
||||||
struct TALER_MINTDB_RefreshCommitLinkP *const* commit_link);
|
struct TALER_MINTDB_RefreshCommitLinkP *const* commit_link);
|
||||||
|
@ -43,7 +43,6 @@
|
|||||||
* @param num_new_denoms number of coins to be created, size of y-dimension of @a commit_link array
|
* @param num_new_denoms number of coins to be created, size of y-dimension of @a commit_link array
|
||||||
* @param denom_pubs array of @a num_new_denoms keys
|
* @param denom_pubs array of @a num_new_denoms keys
|
||||||
* @param coin_count number of coins to be melted, size of y-dimension of @a commit_coin array
|
* @param coin_count number of coins to be melted, size of y-dimension of @a commit_coin array
|
||||||
* @param coin_public_infos array with @a coin_count entries about the coins
|
|
||||||
* @param coin_melt_details array with @a coin_count entries with melting details
|
* @param coin_melt_details array with @a coin_count entries with melting details
|
||||||
* @param session_hash hash over the data that the client commits to
|
* @param session_hash hash over the data that the client commits to
|
||||||
* @param commit_coin 2d array of coin commitments (what the mint is to sign
|
* @param commit_coin 2d array of coin commitments (what the mint is to sign
|
||||||
@ -58,7 +57,6 @@ handle_refresh_melt_binary (struct MHD_Connection *connection,
|
|||||||
unsigned int num_new_denoms,
|
unsigned int num_new_denoms,
|
||||||
const struct TALER_DenominationPublicKey *denom_pubs,
|
const struct TALER_DenominationPublicKey *denom_pubs,
|
||||||
unsigned int coin_count,
|
unsigned int coin_count,
|
||||||
struct TALER_CoinPublicInfo *coin_public_infos,
|
|
||||||
const struct TMH_DB_MeltDetails *coin_melt_details,
|
const struct TMH_DB_MeltDetails *coin_melt_details,
|
||||||
const struct GNUNET_HashCode *session_hash,
|
const struct GNUNET_HashCode *session_hash,
|
||||||
struct TALER_MINTDB_RefreshCommitCoin *const* commit_coin,
|
struct TALER_MINTDB_RefreshCommitCoin *const* commit_coin,
|
||||||
@ -111,7 +109,7 @@ handle_refresh_melt_binary (struct MHD_Connection *connection,
|
|||||||
/* calculate contribution of the i-th melt by subtracting
|
/* calculate contribution of the i-th melt by subtracting
|
||||||
the fee; add the rest to the total_melt value */
|
the fee; add the rest to the total_melt value */
|
||||||
dki = &TMH_KS_denomination_key_lookup (key_state,
|
dki = &TMH_KS_denomination_key_lookup (key_state,
|
||||||
&coin_public_infos[i].denom_pub)->issue;
|
&coin_melt_details[i].coin_info.denom_pub)->issue;
|
||||||
TALER_amount_ntoh (&fee_melt,
|
TALER_amount_ntoh (&fee_melt,
|
||||||
&dki->fee_refresh);
|
&dki->fee_refresh);
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
@ -146,14 +144,13 @@ handle_refresh_melt_binary (struct MHD_Connection *connection,
|
|||||||
"error", "value mismatch");
|
"error", "value mismatch");
|
||||||
}
|
}
|
||||||
return TMH_DB_execute_refresh_melt (connection,
|
return TMH_DB_execute_refresh_melt (connection,
|
||||||
session_hash,
|
session_hash,
|
||||||
num_new_denoms,
|
num_new_denoms,
|
||||||
denom_pubs,
|
denom_pubs,
|
||||||
coin_count,
|
coin_count,
|
||||||
coin_public_infos,
|
coin_melt_details,
|
||||||
coin_melt_details,
|
commit_coin,
|
||||||
commit_coin,
|
commit_link);
|
||||||
commit_link);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -162,7 +159,6 @@ handle_refresh_melt_binary (struct MHD_Connection *connection,
|
|||||||
*
|
*
|
||||||
* @param connection the connection to send error responses to
|
* @param connection the connection to send error responses to
|
||||||
* @param coin_info the JSON object to extract the coin info from
|
* @param coin_info the JSON object to extract the coin info from
|
||||||
* @param[out] r_public_info set to the coin's public information
|
|
||||||
* @param[out] r_melt_detail set to details about the coin's melting permission (if valid)
|
* @param[out] r_melt_detail set to details about the coin's melting permission (if valid)
|
||||||
* @return #GNUNET_YES if coin public info in JSON was valid
|
* @return #GNUNET_YES if coin public info in JSON was valid
|
||||||
* #GNUNET_NO JSON was invalid, response was generated
|
* #GNUNET_NO JSON was invalid, response was generated
|
||||||
@ -171,7 +167,6 @@ handle_refresh_melt_binary (struct MHD_Connection *connection,
|
|||||||
static int
|
static int
|
||||||
get_coin_public_info (struct MHD_Connection *connection,
|
get_coin_public_info (struct MHD_Connection *connection,
|
||||||
json_t *coin_info,
|
json_t *coin_info,
|
||||||
struct TALER_CoinPublicInfo *r_public_info,
|
|
||||||
struct TMH_DB_MeltDetails *r_melt_detail)
|
struct TMH_DB_MeltDetails *r_melt_detail)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -180,7 +175,7 @@ get_coin_public_info (struct MHD_Connection *connection,
|
|||||||
struct TALER_DenominationPublicKey pk;
|
struct TALER_DenominationPublicKey pk;
|
||||||
struct TALER_Amount amount;
|
struct TALER_Amount amount;
|
||||||
struct TMH_PARSE_FieldSpecification spec[] = {
|
struct TMH_PARSE_FieldSpecification spec[] = {
|
||||||
TMH_PARSE_MEMBER_FIXED ("coin_pub", &r_public_info->coin_pub),
|
TMH_PARSE_MEMBER_FIXED ("coin_pub", &r_melt_detail->coin_info.coin_pub),
|
||||||
TMH_PARSE_MEMBER_RSA_SIGNATURE ("denom_sig", &sig.rsa_signature),
|
TMH_PARSE_MEMBER_RSA_SIGNATURE ("denom_sig", &sig.rsa_signature),
|
||||||
TMH_PARSE_MEMBER_RSA_PUBLIC_KEY ("denom_pub", &pk.rsa_public_key),
|
TMH_PARSE_MEMBER_RSA_PUBLIC_KEY ("denom_pub", &pk.rsa_public_key),
|
||||||
TMH_PARSE_MEMBER_FIXED ("confirm_sig", &melt_sig),
|
TMH_PARSE_MEMBER_FIXED ("confirm_sig", &melt_sig),
|
||||||
@ -189,24 +184,24 @@ get_coin_public_info (struct MHD_Connection *connection,
|
|||||||
};
|
};
|
||||||
|
|
||||||
ret = TMH_PARSE_json_data (connection,
|
ret = TMH_PARSE_json_data (connection,
|
||||||
coin_info,
|
coin_info,
|
||||||
spec);
|
spec);
|
||||||
if (GNUNET_OK != ret)
|
if (GNUNET_OK != ret)
|
||||||
return ret;
|
return ret;
|
||||||
/* check mint signature on the coin */
|
/* check mint signature on the coin */
|
||||||
r_public_info->denom_sig = sig;
|
r_melt_detail->coin_info.denom_sig = sig;
|
||||||
r_public_info->denom_pub = pk;
|
r_melt_detail->coin_info.denom_pub = pk;
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
TALER_test_coin_valid (r_public_info))
|
TALER_test_coin_valid (&r_melt_detail->coin_info))
|
||||||
{
|
{
|
||||||
TMH_PARSE_release_data (spec);
|
TMH_PARSE_release_data (spec);
|
||||||
r_public_info->denom_sig.rsa_signature = NULL;
|
r_melt_detail->coin_info.denom_sig.rsa_signature = NULL;
|
||||||
r_public_info->denom_pub.rsa_public_key = NULL;
|
r_melt_detail->coin_info.denom_pub.rsa_public_key = NULL;
|
||||||
return (MHD_YES ==
|
return (MHD_YES ==
|
||||||
TMH_RESPONSE_reply_json_pack (connection,
|
TMH_RESPONSE_reply_json_pack (connection,
|
||||||
MHD_HTTP_NOT_FOUND,
|
MHD_HTTP_NOT_FOUND,
|
||||||
"{s:s}",
|
"{s:s}",
|
||||||
"error", "coin invalid"))
|
"error", "coin invalid"))
|
||||||
? GNUNET_NO : GNUNET_SYSERR;
|
? GNUNET_NO : GNUNET_SYSERR;
|
||||||
}
|
}
|
||||||
r_melt_detail->melt_sig = melt_sig;
|
r_melt_detail->melt_sig = melt_sig;
|
||||||
@ -225,8 +220,7 @@ get_coin_public_info (struct MHD_Connection *connection,
|
|||||||
*
|
*
|
||||||
* @param connection the connection to send error responses to
|
* @param connection the connection to send error responses to
|
||||||
* @param session_hash hash over refresh session the coin is melted into
|
* @param session_hash hash over refresh session the coin is melted into
|
||||||
* @param r_public_info the coin's public information
|
* @param melt_detail details about the coin's melting permission (if valid)
|
||||||
* @param r_melt_detail details about the coin's melting permission (if valid)
|
|
||||||
* @return #GNUNET_YES if coin public info in JSON was valid
|
* @return #GNUNET_YES if coin public info in JSON was valid
|
||||||
* #GNUNET_NO JSON was invalid, response was generated
|
* #GNUNET_NO JSON was invalid, response was generated
|
||||||
* #GNUNET_SYSERR on internal error
|
* #GNUNET_SYSERR on internal error
|
||||||
@ -234,8 +228,7 @@ get_coin_public_info (struct MHD_Connection *connection,
|
|||||||
static int
|
static int
|
||||||
verify_coin_public_info (struct MHD_Connection *connection,
|
verify_coin_public_info (struct MHD_Connection *connection,
|
||||||
const struct GNUNET_HashCode *session_hash,
|
const struct GNUNET_HashCode *session_hash,
|
||||||
const struct TALER_CoinPublicInfo *r_public_info,
|
const struct TMH_DB_MeltDetails *melt_detail)
|
||||||
const struct TMH_DB_MeltDetails *r_melt_detail)
|
|
||||||
{
|
{
|
||||||
struct TALER_RefreshMeltCoinAffirmationPS body;
|
struct TALER_RefreshMeltCoinAffirmationPS body;
|
||||||
struct TMH_KS_StateHandle *key_state;
|
struct TMH_KS_StateHandle *key_state;
|
||||||
@ -244,7 +237,7 @@ verify_coin_public_info (struct MHD_Connection *connection,
|
|||||||
|
|
||||||
key_state = TMH_KS_acquire ();
|
key_state = TMH_KS_acquire ();
|
||||||
dki = TMH_KS_denomination_key_lookup (key_state,
|
dki = TMH_KS_denomination_key_lookup (key_state,
|
||||||
&r_public_info->denom_pub);
|
&melt_detail->coin_info.denom_pub);
|
||||||
if (NULL == dki)
|
if (NULL == dki)
|
||||||
{
|
{
|
||||||
TMH_KS_release (key_state);
|
TMH_KS_release (key_state);
|
||||||
@ -260,12 +253,12 @@ verify_coin_public_info (struct MHD_Connection *connection,
|
|||||||
body.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_MELT);
|
body.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_MELT);
|
||||||
body.session_hash = *session_hash;
|
body.session_hash = *session_hash;
|
||||||
TALER_amount_hton (&body.amount_with_fee,
|
TALER_amount_hton (&body.amount_with_fee,
|
||||||
&r_melt_detail->melt_amount_with_fee);
|
&melt_detail->melt_amount_with_fee);
|
||||||
TALER_amount_hton (&body.melt_fee,
|
TALER_amount_hton (&body.melt_fee,
|
||||||
&fee_refresh);
|
&fee_refresh);
|
||||||
body.coin_pub = r_public_info->coin_pub;
|
body.coin_pub = melt_detail->coin_info.coin_pub;
|
||||||
if (TALER_amount_cmp (&fee_refresh,
|
if (TALER_amount_cmp (&fee_refresh,
|
||||||
&r_melt_detail->melt_amount_with_fee) < 0)
|
&melt_detail->melt_amount_with_fee) < 0)
|
||||||
{
|
{
|
||||||
TMH_KS_release (key_state);
|
TMH_KS_release (key_state);
|
||||||
return (MHD_YES ==
|
return (MHD_YES ==
|
||||||
@ -278,8 +271,8 @@ verify_coin_public_info (struct MHD_Connection *connection,
|
|||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
GNUNET_CRYPTO_ecdsa_verify (TALER_SIGNATURE_WALLET_COIN_MELT,
|
GNUNET_CRYPTO_ecdsa_verify (TALER_SIGNATURE_WALLET_COIN_MELT,
|
||||||
&body.purpose,
|
&body.purpose,
|
||||||
&r_melt_detail->melt_sig.ecdsa_signature,
|
&melt_detail->melt_sig.ecdsa_signature,
|
||||||
&r_public_info->coin_pub.ecdsa_pub))
|
&melt_detail->coin_info.coin_pub.ecdsa_pub))
|
||||||
{
|
{
|
||||||
if (MHD_YES !=
|
if (MHD_YES !=
|
||||||
TMH_RESPONSE_reply_json_pack (connection,
|
TMH_RESPONSE_reply_json_pack (connection,
|
||||||
@ -384,7 +377,6 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
unsigned int j;
|
unsigned int j;
|
||||||
struct TALER_DenominationPublicKey *denom_pubs;
|
struct TALER_DenominationPublicKey *denom_pubs;
|
||||||
unsigned int num_new_denoms;
|
unsigned int num_new_denoms;
|
||||||
struct TALER_CoinPublicInfo *coin_public_infos;
|
|
||||||
struct TMH_DB_MeltDetails *coin_melt_details;
|
struct TMH_DB_MeltDetails *coin_melt_details;
|
||||||
unsigned int coin_count;
|
unsigned int coin_count;
|
||||||
struct GNUNET_HashCode session_hash;
|
struct GNUNET_HashCode session_hash;
|
||||||
@ -424,10 +416,6 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
}
|
}
|
||||||
|
|
||||||
coin_count = json_array_size (melt_coins);
|
coin_count = json_array_size (melt_coins);
|
||||||
/* FIXME: make 'struct TALER_CoinPublicInfo' part of `struct TMH_DB_MeltDetails`
|
|
||||||
and combine these two arrays/arguments! (#3726) */
|
|
||||||
coin_public_infos = GNUNET_malloc (coin_count *
|
|
||||||
sizeof (struct TALER_CoinPublicInfo));
|
|
||||||
coin_melt_details = GNUNET_malloc (coin_count *
|
coin_melt_details = GNUNET_malloc (coin_count *
|
||||||
sizeof (struct TMH_DB_MeltDetails));
|
sizeof (struct TMH_DB_MeltDetails));
|
||||||
for (i=0;i<coin_count;i++)
|
for (i=0;i<coin_count;i++)
|
||||||
@ -437,16 +425,14 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
|
|
||||||
res = get_coin_public_info (connection,
|
res = get_coin_public_info (connection,
|
||||||
json_array_get (melt_coins, i),
|
json_array_get (melt_coins, i),
|
||||||
&coin_public_infos[i],
|
|
||||||
&coin_melt_details[i]);
|
&coin_melt_details[i]);
|
||||||
if (GNUNET_OK != res)
|
if (GNUNET_OK != res)
|
||||||
{
|
{
|
||||||
for (j=0;j<i;j++)
|
for (j=0;j<i;j++)
|
||||||
{
|
{
|
||||||
GNUNET_CRYPTO_rsa_public_key_free (coin_public_infos[j].denom_pub.rsa_public_key);
|
GNUNET_CRYPTO_rsa_public_key_free (coin_melt_details[j].coin_info.denom_pub.rsa_public_key);
|
||||||
GNUNET_CRYPTO_rsa_signature_free (coin_public_infos[j].denom_sig.rsa_signature);
|
GNUNET_CRYPTO_rsa_signature_free (coin_melt_details[j].coin_info.denom_sig.rsa_signature);
|
||||||
}
|
}
|
||||||
GNUNET_free (coin_public_infos);
|
|
||||||
for (j=0;j<num_new_denoms;j++)
|
for (j=0;j<num_new_denoms;j++)
|
||||||
GNUNET_CRYPTO_rsa_public_key_free (denom_pubs[j].rsa_public_key);
|
GNUNET_CRYPTO_rsa_public_key_free (denom_pubs[j].rsa_public_key);
|
||||||
GNUNET_free (coin_melt_details);
|
GNUNET_free (coin_melt_details);
|
||||||
@ -457,16 +443,15 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
into the same session! */
|
into the same session! */
|
||||||
for (j=0;j<i;j++)
|
for (j=0;j<i;j++)
|
||||||
{
|
{
|
||||||
if (0 == memcmp (&coin_public_infos[i].coin_pub,
|
if (0 == memcmp (&coin_melt_details[i].coin_info.coin_pub,
|
||||||
&coin_public_infos[j].coin_pub,
|
&coin_melt_details[j].coin_info.coin_pub,
|
||||||
sizeof (union TALER_CoinSpendPublicKeyP)))
|
sizeof (union TALER_CoinSpendPublicKeyP)))
|
||||||
{
|
{
|
||||||
for (j=0;j<i;j++)
|
for (j=0;j<i;j++)
|
||||||
{
|
{
|
||||||
GNUNET_CRYPTO_rsa_public_key_free (coin_public_infos[j].denom_pub.rsa_public_key);
|
GNUNET_CRYPTO_rsa_public_key_free (coin_melt_details[j].coin_info.denom_pub.rsa_public_key);
|
||||||
GNUNET_CRYPTO_rsa_signature_free (coin_public_infos[j].denom_sig.rsa_signature);
|
GNUNET_CRYPTO_rsa_signature_free (coin_melt_details[j].coin_info.denom_sig.rsa_signature);
|
||||||
}
|
}
|
||||||
GNUNET_free (coin_public_infos);
|
|
||||||
for (j=0;j<num_new_denoms;j++)
|
for (j=0;j<num_new_denoms;j++)
|
||||||
GNUNET_CRYPTO_rsa_public_key_free (denom_pubs[j].rsa_public_key);
|
GNUNET_CRYPTO_rsa_public_key_free (denom_pubs[j].rsa_public_key);
|
||||||
GNUNET_free (coin_melt_details);
|
GNUNET_free (coin_melt_details);
|
||||||
@ -478,7 +463,7 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
TALER_amount_hton (&melt_amount,
|
TALER_amount_hton (&melt_amount,
|
||||||
&coin_melt_details[i].melt_amount_with_fee);
|
&coin_melt_details[i].melt_amount_with_fee);
|
||||||
GNUNET_CRYPTO_hash_context_read (hash_context,
|
GNUNET_CRYPTO_hash_context_read (hash_context,
|
||||||
&coin_public_infos[i].coin_pub,
|
&coin_melt_details[i].coin_info.coin_pub,
|
||||||
sizeof (union TALER_CoinSpendPublicKeyP));
|
sizeof (union TALER_CoinSpendPublicKeyP));
|
||||||
GNUNET_CRYPTO_hash_context_read (hash_context,
|
GNUNET_CRYPTO_hash_context_read (hash_context,
|
||||||
&melt_amount,
|
&melt_amount,
|
||||||
@ -520,12 +505,12 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
rcc->coin_ev,
|
rcc->coin_ev,
|
||||||
rcc->coin_ev_size);
|
rcc->coin_ev_size);
|
||||||
res = TMH_PARSE_navigate_json (connection,
|
res = TMH_PARSE_navigate_json (connection,
|
||||||
link_encs,
|
link_encs,
|
||||||
TMH_PARSE_JNC_INDEX, (int) i,
|
TMH_PARSE_JNC_INDEX, (int) i,
|
||||||
TMH_PARSE_JNC_INDEX, (int) j,
|
TMH_PARSE_JNC_INDEX, (int) j,
|
||||||
TMH_PARSE_JNC_RET_DATA_VAR,
|
TMH_PARSE_JNC_RET_DATA_VAR,
|
||||||
&link_enc,
|
&link_enc,
|
||||||
&link_enc_size);
|
&link_enc_size);
|
||||||
if (GNUNET_OK != res)
|
if (GNUNET_OK != res)
|
||||||
{
|
{
|
||||||
GNUNET_CRYPTO_hash_context_abort (hash_context);
|
GNUNET_CRYPTO_hash_context_abort (hash_context);
|
||||||
@ -552,12 +537,12 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
struct TALER_MINTDB_RefreshCommitLinkP *rcl = &commit_link[i][j];
|
struct TALER_MINTDB_RefreshCommitLinkP *rcl = &commit_link[i][j];
|
||||||
|
|
||||||
res = TMH_PARSE_navigate_json (connection,
|
res = TMH_PARSE_navigate_json (connection,
|
||||||
transfer_pubs,
|
transfer_pubs,
|
||||||
TMH_PARSE_JNC_INDEX, (int) i,
|
TMH_PARSE_JNC_INDEX, (int) i,
|
||||||
TMH_PARSE_JNC_INDEX, (int) j,
|
TMH_PARSE_JNC_INDEX, (int) j,
|
||||||
TMH_PARSE_JNC_RET_DATA,
|
TMH_PARSE_JNC_RET_DATA,
|
||||||
&rcl->transfer_pub,
|
&rcl->transfer_pub,
|
||||||
sizeof (struct TALER_TransferPublicKeyP));
|
sizeof (struct TALER_TransferPublicKeyP));
|
||||||
|
|
||||||
if (GNUNET_OK != res)
|
if (GNUNET_OK != res)
|
||||||
{
|
{
|
||||||
@ -572,12 +557,12 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
return (GNUNET_SYSERR == res) ? MHD_NO : MHD_YES;
|
return (GNUNET_SYSERR == res) ? MHD_NO : MHD_YES;
|
||||||
}
|
}
|
||||||
res = TMH_PARSE_navigate_json (connection,
|
res = TMH_PARSE_navigate_json (connection,
|
||||||
secret_encs,
|
secret_encs,
|
||||||
TMH_PARSE_JNC_INDEX, (int) i,
|
TMH_PARSE_JNC_INDEX, (int) i,
|
||||||
TMH_PARSE_JNC_INDEX, (int) j,
|
TMH_PARSE_JNC_INDEX, (int) j,
|
||||||
TMH_PARSE_JNC_RET_DATA,
|
TMH_PARSE_JNC_RET_DATA,
|
||||||
&rcl->shared_secret_enc,
|
&rcl->shared_secret_enc,
|
||||||
sizeof (struct GNUNET_HashCode));
|
sizeof (struct GNUNET_HashCode));
|
||||||
|
|
||||||
if (GNUNET_OK != res)
|
if (GNUNET_OK != res)
|
||||||
{
|
{
|
||||||
@ -606,7 +591,6 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
/* verify signatures on coins to melt */
|
/* verify signatures on coins to melt */
|
||||||
res = verify_coin_public_info (connection,
|
res = verify_coin_public_info (connection,
|
||||||
&session_hash,
|
&session_hash,
|
||||||
&coin_public_infos[i],
|
|
||||||
&coin_melt_details[i]);
|
&coin_melt_details[i]);
|
||||||
if (GNUNET_OK != res)
|
if (GNUNET_OK != res)
|
||||||
{
|
{
|
||||||
@ -620,7 +604,6 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
num_new_denoms,
|
num_new_denoms,
|
||||||
denom_pubs,
|
denom_pubs,
|
||||||
coin_count,
|
coin_count,
|
||||||
coin_public_infos,
|
|
||||||
coin_melt_details,
|
coin_melt_details,
|
||||||
&session_hash,
|
&session_hash,
|
||||||
commit_coin,
|
commit_coin,
|
||||||
@ -634,10 +617,9 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
|||||||
num_oldcoins);
|
num_oldcoins);
|
||||||
for (j=0;j<coin_count;j++)
|
for (j=0;j<coin_count;j++)
|
||||||
{
|
{
|
||||||
GNUNET_CRYPTO_rsa_public_key_free (coin_public_infos[j].denom_pub.rsa_public_key);
|
GNUNET_CRYPTO_rsa_public_key_free (coin_melt_details[j].coin_info.denom_pub.rsa_public_key);
|
||||||
GNUNET_CRYPTO_rsa_signature_free (coin_public_infos[j].denom_sig.rsa_signature);
|
GNUNET_CRYPTO_rsa_signature_free (coin_melt_details[j].coin_info.denom_sig.rsa_signature);
|
||||||
}
|
}
|
||||||
GNUNET_free (coin_public_infos);
|
|
||||||
for (j=0;j<num_new_denoms;j++)
|
for (j=0;j<num_new_denoms;j++)
|
||||||
GNUNET_CRYPTO_rsa_public_key_free (denom_pubs[j].rsa_public_key);
|
GNUNET_CRYPTO_rsa_public_key_free (denom_pubs[j].rsa_public_key);
|
||||||
GNUNET_free (coin_melt_details);
|
GNUNET_free (coin_melt_details);
|
||||||
|
Loading…
Reference in New Issue
Block a user