fix type of transfer keys
This commit is contained in:
commit
5f879c0b4b
@ -514,11 +514,8 @@ refresh_accept_melts (struct MHD_Connection *connection,
|
||||
|
||||
if (NULL == dki)
|
||||
return (MHD_YES ==
|
||||
TMH_RESPONSE_reply_json_pack (connection,
|
||||
MHD_HTTP_NOT_FOUND,
|
||||
"{s:s}",
|
||||
"error",
|
||||
"denom not found"))
|
||||
TMH_RESPONSE_reply_arg_unknown (connection,
|
||||
"denom_pub"))
|
||||
? GNUNET_NO : GNUNET_SYSERR;
|
||||
|
||||
TALER_amount_ntoh (&coin_value,
|
||||
@ -652,6 +649,23 @@ TMH_DB_execute_refresh_melt (struct MHD_Connection *connection,
|
||||
return TMH_RESPONSE_reply_internal_db_error (connection);
|
||||
}
|
||||
|
||||
/* store 'global' session data */
|
||||
refresh_session.num_oldcoins = coin_count;
|
||||
refresh_session.num_newcoins = num_new_denoms;
|
||||
refresh_session.noreveal_index
|
||||
= GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
|
||||
TALER_CNC_KAPPA);
|
||||
if (GNUNET_OK !=
|
||||
(res = TMH_plugin->create_refresh_session (TMH_plugin->cls,
|
||||
session,
|
||||
session_hash,
|
||||
&refresh_session)))
|
||||
{
|
||||
TMH_plugin->rollback (TMH_plugin->cls,
|
||||
session);
|
||||
return TMH_RESPONSE_reply_internal_db_error (connection);
|
||||
}
|
||||
|
||||
/* Melt old coins and check that they had enough residual value */
|
||||
key_state = TMH_KS_acquire ();
|
||||
for (i=0;i<coin_count;i++)
|
||||
@ -716,26 +730,6 @@ TMH_DB_execute_refresh_melt (struct MHD_Connection *connection,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* store 'global' session data */
|
||||
refresh_session.num_oldcoins = coin_count;
|
||||
refresh_session.num_newcoins = num_new_denoms;
|
||||
refresh_session.noreveal_index
|
||||
= GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
|
||||
TALER_CNC_KAPPA);
|
||||
if (GNUNET_OK !=
|
||||
(res = TMH_plugin->create_refresh_session (TMH_plugin->cls,
|
||||
session,
|
||||
session_hash,
|
||||
&refresh_session)))
|
||||
{
|
||||
TMH_plugin->rollback (TMH_plugin->cls,
|
||||
session);
|
||||
return TMH_RESPONSE_reply_internal_db_error (connection);
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (GNUNET_OK !=
|
||||
TMH_plugin->commit (TMH_plugin->cls,
|
||||
session))
|
||||
@ -1245,11 +1239,8 @@ TMH_DB_execute_refresh_link (struct MHD_Connection *connection,
|
||||
}
|
||||
if (GNUNET_NO == res)
|
||||
{
|
||||
return TMH_RESPONSE_reply_json_pack (connection,
|
||||
MHD_HTTP_NOT_FOUND,
|
||||
"{s:s}",
|
||||
"error",
|
||||
"link data not found (transfer)");
|
||||
return TMH_RESPONSE_reply_arg_unknown (connection,
|
||||
"coin_pub");
|
||||
}
|
||||
GNUNET_assert (GNUNET_OK == res);
|
||||
|
||||
|
@ -198,10 +198,8 @@ get_coin_public_info (struct MHD_Connection *connection,
|
||||
r_melt_detail->coin_info.denom_sig.rsa_signature = NULL;
|
||||
r_melt_detail->coin_info.denom_pub.rsa_public_key = NULL;
|
||||
return (MHD_YES ==
|
||||
TMH_RESPONSE_reply_json_pack (connection,
|
||||
MHD_HTTP_NOT_FOUND,
|
||||
"{s:s}",
|
||||
"error", "coin invalid"))
|
||||
TMH_RESPONSE_reply_signature_invalid (connection,
|
||||
"denom_sig"))
|
||||
? GNUNET_NO : GNUNET_SYSERR;
|
||||
}
|
||||
r_melt_detail->melt_sig = melt_sig;
|
||||
@ -242,7 +240,7 @@ verify_coin_public_info (struct MHD_Connection *connection,
|
||||
{
|
||||
TMH_KS_release (key_state);
|
||||
TALER_LOG_WARNING ("Unknown denomination key in /refresh/melt request\n");
|
||||
return TMH_RESPONSE_reply_arg_invalid (connection,
|
||||
return TMH_RESPONSE_reply_arg_unknown (connection,
|
||||
"denom_pub");
|
||||
}
|
||||
/* FIXME: need to check if denomination key is still
|
||||
@ -275,10 +273,8 @@ verify_coin_public_info (struct MHD_Connection *connection,
|
||||
&melt_detail->coin_info.coin_pub.ecdsa_pub))
|
||||
{
|
||||
if (MHD_YES !=
|
||||
TMH_RESPONSE_reply_json_pack (connection,
|
||||
MHD_HTTP_UNAUTHORIZED,
|
||||
"{s:s}",
|
||||
"error", "signature invalid"))
|
||||
TMH_RESPONSE_reply_signature_invalid (connection,
|
||||
"confirm_sig"))
|
||||
return GNUNET_SYSERR;
|
||||
return GNUNET_NO;
|
||||
}
|
||||
@ -558,7 +554,7 @@ handle_refresh_melt_json (struct MHD_Connection *connection,
|
||||
TMH_PARSE_JNC_INDEX, (int) j,
|
||||
TMH_PARSE_JNC_RET_DATA,
|
||||
&rcl->shared_secret_enc,
|
||||
sizeof (struct GNUNET_HashCode));
|
||||
sizeof (struct TALER_EncryptedLinkSecretP));
|
||||
|
||||
if (GNUNET_OK != res)
|
||||
{
|
||||
|
@ -442,7 +442,7 @@ TMH_RESPONSE_reply_deposit_insufficient_funds (struct MHD_Connection *connection
|
||||
|
||||
history = compile_transaction_history (tl);
|
||||
return TMH_RESPONSE_reply_json_pack (connection,
|
||||
MHD_HTTP_FORBIDDEN,
|
||||
MHD_HTTP_PRECONDITION_FAILED,
|
||||
"{s:s, s:o}",
|
||||
"error", "insufficient funds",
|
||||
"history", history);
|
||||
@ -625,7 +625,7 @@ TMH_RESPONSE_reply_withdraw_sign_insufficient_funds (struct MHD_Connection *conn
|
||||
"balance calculation failure");
|
||||
json_balance = TALER_json_from_amount (&balance);
|
||||
ret = TMH_RESPONSE_reply_json_pack (connection,
|
||||
MHD_HTTP_PAYMENT_REQUIRED,
|
||||
MHD_HTTP_FORBIDDEN,
|
||||
"{s:s, s:o, s:o}",
|
||||
"error", "Insufficient funds"
|
||||
"balance", json_balance,
|
||||
@ -794,7 +794,7 @@ TMH_RESPONSE_reply_refresh_reveal_missmatch (struct MHD_Connection *connection,
|
||||
const char *missmatch_object)
|
||||
{
|
||||
return TMH_RESPONSE_reply_json_pack (connection,
|
||||
MHD_HTTP_BAD_REQUEST,
|
||||
MHD_HTTP_CONFLICT,
|
||||
"{s:s, s:i, s:i, s:s}",
|
||||
"error", "commitment violation",
|
||||
"offset", (int) off,
|
||||
@ -829,7 +829,8 @@ TMH_RESPONSE_reply_refresh_link_success (struct MHD_Connection *connection,
|
||||
json_t *obj;
|
||||
|
||||
obj = json_object ();
|
||||
json_object_set_new (obj, "link_enc",
|
||||
json_object_set_new (obj,
|
||||
"link_enc",
|
||||
TALER_json_from_data (ldl->link_data_enc->coin_priv_enc,
|
||||
sizeof (union TALER_CoinSpendPrivateKeyP) +
|
||||
ldl->link_data_enc->blinding_key_enc_size));
|
||||
|
@ -223,11 +223,18 @@ postgres_create_tables (void *cls,
|
||||
",expended_currency VARCHAR(4) NOT NULL"
|
||||
",refresh_session_hash BYTEA"
|
||||
")");
|
||||
/**
|
||||
* The DB will show negative values for some values of the following fields as
|
||||
* we use them as 16 bit unsigned integers
|
||||
* @a num_oldcoins
|
||||
* @a num_newcoins
|
||||
* Do not do arithmetic in SQL on these fields
|
||||
*/
|
||||
SQLEXEC("CREATE TABLE IF NOT EXISTS refresh_sessions "
|
||||
"("
|
||||
" session_hash BYTEA PRIMARY KEY CHECK (length(session_hash) = 32)"
|
||||
",session_melt_sig BYTEA"
|
||||
",session_commit_sig BYTEA"
|
||||
",num_oldcoins INT2 NOT NULL"
|
||||
",num_newcoins INT2 NOT NULL"
|
||||
",noreveal_index INT2 NOT NULL"
|
||||
// non-zero if all reveals were ok
|
||||
// and the new coin signatures are ready
|
||||
@ -389,23 +396,24 @@ postgres_prepare (PGconn *db_conn)
|
||||
" FROM collectable_blindcoins"
|
||||
" WHERE reserve_pub=$1;",
|
||||
1, NULL);
|
||||
|
||||
/* FIXME: does it make sense to store these computed values in the DB? */
|
||||
#if 0
|
||||
/* refreshing */
|
||||
PREPARE ("get_refresh_session",
|
||||
"SELECT "
|
||||
" (SELECT count(*) FROM refresh_melt WHERE session_hash = $1)::INT2 as num_oldcoins "
|
||||
",(SELECT count(*) FROM refresh_blind_session_keys "
|
||||
" WHERE session_hash = $1 and cnc_index = 0)::INT2 as num_newcoins "
|
||||
",(SELECT count(*) FROM refresh_blind_session_keys "
|
||||
" WHERE session_hash = $1 and newcoin_index = 0)::INT2 as kappa "
|
||||
" num_oldcoins"
|
||||
",num_newcoins"
|
||||
",noreveal_index"
|
||||
",session_commit_sig "
|
||||
",reveal_ok "
|
||||
" FROM refresh_sessions "
|
||||
" WHERE session_hash = $1 ",
|
||||
1, NULL);
|
||||
#endif
|
||||
PREPARE ("insert_refresh_session",
|
||||
"INSERT INTO refresh_sessions ( "
|
||||
" session_hash "
|
||||
",num_oldcoins "
|
||||
",num_newcoins "
|
||||
",noreveal_index "
|
||||
") "
|
||||
"VALUES ($1, $2, $3, $4) ",
|
||||
4, NULL);
|
||||
|
||||
PREPARE ("get_known_coin",
|
||||
"SELECT "
|
||||
@ -485,13 +493,6 @@ postgres_prepare (PGconn *db_conn)
|
||||
"FROM refresh_melt "
|
||||
"WHERE session_hash = $1 AND oldcoin_index = $2",
|
||||
2, NULL);
|
||||
PREPARE ("insert_refresh_session",
|
||||
"INSERT INTO refresh_sessions ( "
|
||||
" session_hash "
|
||||
",noreveal_index "
|
||||
") "
|
||||
"VALUES ($1, $2) ",
|
||||
2, NULL);
|
||||
PREPARE ("insert_refresh_commit_link",
|
||||
"INSERT INTO refresh_commit_link ( "
|
||||
" session_hash "
|
||||
@ -1451,61 +1452,59 @@ postgres_get_refresh_session (void *cls,
|
||||
const struct GNUNET_HashCode *session_hash,
|
||||
struct TALER_MINTDB_RefreshSession *refresh_session)
|
||||
{
|
||||
// FIXME: check logic!
|
||||
int res;
|
||||
PGresult *result;
|
||||
struct TALER_PQ_QueryParam params[] = {
|
||||
TALER_PQ_QUERY_PARAM_PTR(session_hash),
|
||||
TALER_PQ_QUERY_PARAM_END
|
||||
};
|
||||
int ret;
|
||||
uint16_t num_oldcoins;
|
||||
uint16_t num_newcoins;
|
||||
uint16_t noreveal_index;
|
||||
|
||||
PGresult *result = TALER_PQ_exec_prepared (session->conn,
|
||||
ret = GNUNET_SYSERR;
|
||||
result = TALER_PQ_exec_prepared (session->conn,
|
||||
"get_refresh_session",
|
||||
params);
|
||||
|
||||
if (PGRES_TUPLES_OK != PQresultStatus (result))
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Query failed: %s\n",
|
||||
PQresultErrorMessage (result));
|
||||
PQclear (result);
|
||||
return GNUNET_SYSERR;
|
||||
BREAK_DB_ERR (result);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (0 == PQntuples (result))
|
||||
return GNUNET_NO;
|
||||
|
||||
{
|
||||
ret = GNUNET_NO;
|
||||
goto cleanup;
|
||||
}
|
||||
GNUNET_assert (1 == PQntuples (result));
|
||||
|
||||
/* We're done if the caller is only interested in
|
||||
* whether the session exists or not */
|
||||
|
||||
/* We're done if the caller is only interested in whether the session exists
|
||||
* or not */
|
||||
if (NULL == refresh_session)
|
||||
return GNUNET_YES;
|
||||
|
||||
memset (session, 0, sizeof (struct TALER_MINTDB_RefreshSession));
|
||||
|
||||
{
|
||||
ret = GNUNET_YES;
|
||||
goto cleanup;
|
||||
}
|
||||
memset (refresh_session, 0, sizeof (struct TALER_MINTDB_RefreshSession));
|
||||
struct TALER_PQ_ResultSpec rs[] = {
|
||||
TALER_PQ_RESULT_SPEC("num_oldcoins", &refresh_session->num_oldcoins),
|
||||
TALER_PQ_RESULT_SPEC("num_newcoins", &refresh_session->num_newcoins),
|
||||
TALER_PQ_RESULT_SPEC("noreveal_index", &refresh_session->noreveal_index),
|
||||
TALER_PQ_RESULT_SPEC("num_oldcoins", &num_oldcoins),
|
||||
TALER_PQ_RESULT_SPEC("num_newcoins", &num_newcoins),
|
||||
TALER_PQ_RESULT_SPEC("noreveal_index", &noreveal_index),
|
||||
TALER_PQ_RESULT_SPEC_END
|
||||
};
|
||||
|
||||
res = TALER_PQ_extract_result (result, rs, 0);
|
||||
|
||||
if (GNUNET_OK != res)
|
||||
if (GNUNET_OK != TALER_PQ_extract_result (result, rs, 0))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
PQclear (result);
|
||||
return GNUNET_SYSERR;
|
||||
goto cleanup;
|
||||
}
|
||||
refresh_session->num_oldcoins = ntohs (num_oldcoins);
|
||||
refresh_session->num_newcoins = ntohs (num_newcoins);
|
||||
refresh_session->noreveal_index = ntohs (noreveal_index);
|
||||
ret = GNUNET_YES;
|
||||
|
||||
refresh_session->num_oldcoins = ntohs (refresh_session->num_oldcoins);
|
||||
refresh_session->num_newcoins = ntohs (refresh_session->num_newcoins);
|
||||
refresh_session->noreveal_index = ntohs (refresh_session->noreveal_index);
|
||||
|
||||
cleanup:
|
||||
if (NULL != result)
|
||||
PQclear (result);
|
||||
return GNUNET_YES;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@ -1525,28 +1524,29 @@ postgres_create_refresh_session (void *cls,
|
||||
const struct GNUNET_HashCode *session_hash,
|
||||
const struct TALER_MINTDB_RefreshSession *refresh_session)
|
||||
{
|
||||
// FIXME: actually store session data!
|
||||
PGresult *result;
|
||||
uint16_t num_oldcoins;
|
||||
uint16_t num_newcoins;
|
||||
uint16_t noreveal_index;
|
||||
struct TALER_PQ_QueryParam params[] = {
|
||||
TALER_PQ_QUERY_PARAM_PTR(session_hash),
|
||||
TALER_PQ_QUERY_PARAM_PTR(&num_oldcoins),
|
||||
TALER_PQ_QUERY_PARAM_PTR(&num_newcoins),
|
||||
TALER_PQ_QUERY_PARAM_PTR(&noreveal_index),
|
||||
TALER_PQ_QUERY_PARAM_END
|
||||
};
|
||||
|
||||
noreveal_index = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 1<<15);
|
||||
noreveal_index = htonl (noreveal_index);
|
||||
|
||||
PGresult *result = TALER_PQ_exec_prepared (session->conn,
|
||||
num_oldcoins = htons (refresh_session->num_oldcoins);
|
||||
num_newcoins = htons (refresh_session->num_newcoins);
|
||||
noreveal_index = htons (refresh_session->noreveal_index);
|
||||
result = TALER_PQ_exec_prepared (session->conn,
|
||||
"insert_refresh_session",
|
||||
params);
|
||||
|
||||
if (PGRES_COMMAND_OK != PQresultStatus (result))
|
||||
{
|
||||
BREAK_DB_ERR (result);
|
||||
PQclear (result);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
PQclear (result);
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
@ -325,6 +325,28 @@ run (void *cls,
|
||||
plugin->have_deposit (plugin->cls,
|
||||
session,
|
||||
&deposit2));
|
||||
/* Tests for refreshing */
|
||||
{
|
||||
struct TALER_MINTDB_RefreshSession refresh_session;
|
||||
struct TALER_MINTDB_RefreshSession ret_refresh_session;
|
||||
struct GNUNET_HashCode session_hash;
|
||||
RND_BLK (&refresh_session);
|
||||
RND_BLK (&session_hash);
|
||||
refresh_session.num_oldcoins = UINT16_MAX;
|
||||
refresh_session.num_newcoins = 1;
|
||||
refresh_session.noreveal_index = 1;
|
||||
FAILIF (GNUNET_OK != plugin->create_refresh_session (plugin->cls,
|
||||
session,
|
||||
&session_hash,
|
||||
&refresh_session));
|
||||
FAILIF (GNUNET_OK != plugin->get_refresh_session (plugin->cls,
|
||||
session,
|
||||
&session_hash,
|
||||
&ret_refresh_session));
|
||||
FAILIF (0 != memcmp (&ret_refresh_session,
|
||||
&refresh_session,
|
||||
sizeof (refresh_session)));
|
||||
}
|
||||
result = 0;
|
||||
|
||||
drop:
|
||||
|
Loading…
Reference in New Issue
Block a user