more work on /refresh skeleton and internal data structures
This commit is contained in:
parent
6418724aad
commit
c4f75cfc1b
@ -33,6 +33,321 @@
|
|||||||
|
|
||||||
/* ********************* /refresh/ common ***************************** */
|
/* ********************* /refresh/ common ***************************** */
|
||||||
|
|
||||||
|
/* structures for committing refresh data to disk before doing the
|
||||||
|
network interaction(s) */
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Header of serialized information about a coin we are melting.
|
||||||
|
*/
|
||||||
|
struct MeltedCoinP
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Private key of the coin.
|
||||||
|
*/
|
||||||
|
struct TALER_CoinSpendPrivateKeyP coin_priv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Amount this coin contributes to the melt, including fee.
|
||||||
|
*/
|
||||||
|
struct TALER_AmountNBO melt_amount_with_fee;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The applicable fee for withdrawing a coin of this denomination
|
||||||
|
*/
|
||||||
|
struct TALER_AmountNBO fee_withdraw;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer private keys for each cut-and-choose dimension.
|
||||||
|
*/
|
||||||
|
struct TALER_TransferPrivateKeyP transfer_priv[TALER_CNC_KAPPA];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timestamp indicating when coins of this denomination become invalid.
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_AbsoluteNBO deposit_valid_until;
|
||||||
|
|
||||||
|
/* Followed by serializations of:
|
||||||
|
1) struct TALER_DenominationPublicKey pub_key;
|
||||||
|
2) struct TALER_DenominationSignature sig;
|
||||||
|
*/
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Header for serializations of coin-specific information about the
|
||||||
|
* fresh coins we generate during a melt.
|
||||||
|
*/
|
||||||
|
struct FreshCoinP
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private key of the coin.
|
||||||
|
*/
|
||||||
|
struct TALER_CoinSpendPrivateKeyP coin_priv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Link secret used to encrypt the @a coin_priv and the blinding
|
||||||
|
* key in the linkage data.
|
||||||
|
*/
|
||||||
|
struct TALER_LinkSecretP link_secret;
|
||||||
|
|
||||||
|
/* Followed by serialization of:
|
||||||
|
- struct TALER_DenominationBlindingKey blinding_key;
|
||||||
|
*/
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Header of serialized data about a melt operation, suitable for
|
||||||
|
* persisting it on disk.
|
||||||
|
*/
|
||||||
|
struct MeltDataP
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hash over the melting session.
|
||||||
|
*/
|
||||||
|
struct GNUNET_HashCode melt_session_hash;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer secrets for each cut-and-choose dimension.
|
||||||
|
*/
|
||||||
|
struct TALER_TransferSecretP transfer_secrets[TALER_CNC_KAPPA];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of coins we are melting, in NBO
|
||||||
|
*/
|
||||||
|
uint16_t num_melted_coins GNUNET_PACKED;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of coins we are creating, in NBO
|
||||||
|
*/
|
||||||
|
uint16_t num_fresh_coins GNUNET_PACKED;
|
||||||
|
|
||||||
|
/* Followed by serializations of:
|
||||||
|
1) struct MeltedCoinP melted_coins[num_melted_coins];
|
||||||
|
2) struct TALER_MINT_DenomPublicKey fresh_pks[num_fresh_coins];
|
||||||
|
3) struct FreshCoinP fresh_coins[num_fresh_coins][k];
|
||||||
|
*/
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information about a coin we are melting.
|
||||||
|
*/
|
||||||
|
struct MeltedCoin
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Private key of the coin.
|
||||||
|
*/
|
||||||
|
struct TALER_CoinSpendPrivateKeyP coin_priv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Amount this coin contributes to the melt, including fee.
|
||||||
|
*/
|
||||||
|
struct TALER_Amount melt_amount_with_fee;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The applicable fee for withdrawing a coin of this denomination
|
||||||
|
*/
|
||||||
|
struct TALER_Amount fee_withdraw;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer private keys for each cut-and-choose dimension.
|
||||||
|
*/
|
||||||
|
struct TALER_TransferPrivateKeyP transfer_priv[TALER_CNC_KAPPA];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timestamp indicating when coins of this denomination become invalid.
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_AbsoluteNBO deposit_valid_until;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Denomination key of the original coin.
|
||||||
|
*/
|
||||||
|
struct TALER_DenominationPublicKey pub_key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mint's signature over the coin.
|
||||||
|
*/
|
||||||
|
struct TALER_DenominationSignature sig;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Coin-specific information about the fresh coins we generate during
|
||||||
|
* a melt.
|
||||||
|
*/
|
||||||
|
struct FreshCoin
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private key of the coin.
|
||||||
|
*/
|
||||||
|
struct TALER_CoinSpendPrivateKeyP coin_priv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Link secret used to encrypt the @a coin_priv and the blinding
|
||||||
|
* key in the linkage data.
|
||||||
|
*/
|
||||||
|
struct TALER_LinkSecretP link_secret;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Blinding key used for blinding during blind signing.
|
||||||
|
*/
|
||||||
|
struct TALER_DenominationBlindingKey blinding_key;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Melt data in non-serialized format for convenient processing.
|
||||||
|
*/
|
||||||
|
struct MeltData
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hash over the melting session.
|
||||||
|
*/
|
||||||
|
struct GNUNET_HashCode melt_session_hash;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer secrets for each cut-and-choose dimension.
|
||||||
|
*/
|
||||||
|
struct TALER_TransferSecretP transfer_secrets[TALER_CNC_KAPPA];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of coins we are melting
|
||||||
|
*/
|
||||||
|
uint16_t num_melted_coins;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of coins we are creating
|
||||||
|
*/
|
||||||
|
uint16_t num_fresh_coins;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information about the melted coins in an array of length @e
|
||||||
|
* num_melted_coins.
|
||||||
|
*/
|
||||||
|
struct MeltedCoin *melted_coins;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of @e num_fresh_coins denomination keys for the coins to be
|
||||||
|
* freshly minted.
|
||||||
|
*/
|
||||||
|
struct TALER_DenominationPublicKey *fresh_pks;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Arrays of @e num_fresh_coins with information about the fresh
|
||||||
|
* coins to be created, for each cut-and-choose dimension.
|
||||||
|
*/
|
||||||
|
struct FreshCoin *fresh_coins[TALER_CNC_KAPPA];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free all information associated with a melted coin session.
|
||||||
|
*
|
||||||
|
* @param mc melted coin to release, the pointer itself is NOT
|
||||||
|
* freed (as it is typically not allocated by itself)
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
free_melted_coin (struct MeltedCoin *mc)
|
||||||
|
{
|
||||||
|
GNUNET_CRYPTO_rsa_public_key_free (mc->pub_key.rsa_public_key);
|
||||||
|
GNUNET_CRYPTO_rsa_signature_free (mc->sig.rsa_signature);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free all information associated with a fresh coin.
|
||||||
|
*
|
||||||
|
* @param fc fresh coin to release, the pointer itself is NOT
|
||||||
|
* freed (as it is typically not allocated by itself)
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
free_fresh_coin (struct FreshCoin *fc)
|
||||||
|
{
|
||||||
|
GNUNET_CRYPTO_rsa_blinding_key_free (fc->blinding_key.rsa_blinding_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free all information associated with a melting session.
|
||||||
|
*
|
||||||
|
* @param md melting data to release, the pointer itself is NOT
|
||||||
|
* freed (as it is typically not allocated by itself)
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
free_melt_data (struct MeltData *md)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
unsigned int j;
|
||||||
|
|
||||||
|
for (i=0;i<md->num_melted_coins;i++)
|
||||||
|
free_melted_coin (&md->melted_coins[i]);
|
||||||
|
GNUNET_free (md->melted_coins);
|
||||||
|
|
||||||
|
for (i=0;i<md->num_fresh_coins;i++)
|
||||||
|
GNUNET_CRYPTO_rsa_public_key_free (md->fresh_pks[i].rsa_public_key);
|
||||||
|
GNUNET_free (md->fresh_pks);
|
||||||
|
|
||||||
|
for (i=0;i<TALER_CNC_KAPPA;i++)
|
||||||
|
{
|
||||||
|
for (j=0;j<md->num_fresh_coins;j++)
|
||||||
|
free_fresh_coin (&md->fresh_coins[i][j]);
|
||||||
|
GNUNET_free (md->fresh_coins[i]);
|
||||||
|
}
|
||||||
|
/* Finally, clean up a bit...
|
||||||
|
(NOTE: compilers might optimize this away, so this is
|
||||||
|
not providing any strong assurances that the key material
|
||||||
|
is purged.) */
|
||||||
|
memset (md,
|
||||||
|
0,
|
||||||
|
sizeof (struct MeltData));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialize melt data.
|
||||||
|
*
|
||||||
|
* @param md data to serialize
|
||||||
|
* @param[out] res_size size of buffer returned
|
||||||
|
* @return serialized melt data
|
||||||
|
*/
|
||||||
|
static char *
|
||||||
|
serialize_melt_data (const struct MeltData *md,
|
||||||
|
size_t *res_size)
|
||||||
|
{
|
||||||
|
GNUNET_break (0); // FIXME: not implemented
|
||||||
|
*res_size = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserialize melt data.
|
||||||
|
*
|
||||||
|
* @param buf serialized data
|
||||||
|
* @param buf_size size of @a buf
|
||||||
|
* @return deserialized melt data, NULL on error
|
||||||
|
*/
|
||||||
|
static struct MeltData *
|
||||||
|
deserialize_melt_data (const char *buf,
|
||||||
|
size_t buf_size)
|
||||||
|
{
|
||||||
|
GNUNET_break (0); // FIXME: not implemented
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Melt (partially spent) coins to obtain fresh coins that are
|
* Melt (partially spent) coins to obtain fresh coins that are
|
||||||
@ -87,9 +402,16 @@ TALER_MINT_refresh_prepare (unsigned int num_melts,
|
|||||||
const struct TALER_MINT_DenomPublicKey *fresh_pks,
|
const struct TALER_MINT_DenomPublicKey *fresh_pks,
|
||||||
size_t *res_size)
|
size_t *res_size)
|
||||||
{
|
{
|
||||||
|
struct MeltData md;
|
||||||
|
char *buf;
|
||||||
|
|
||||||
GNUNET_break (0); // FIXME: not implemented
|
GNUNET_break (0); // FIXME: not implemented
|
||||||
*res_size = 0;
|
// FIXME: init 'md' here!
|
||||||
return NULL;
|
|
||||||
|
buf = serialize_melt_data (&md,
|
||||||
|
res_size);
|
||||||
|
free_melt_data (&md);
|
||||||
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -137,6 +459,10 @@ struct TALER_MINT_RefreshMeltHandle
|
|||||||
*/
|
*/
|
||||||
struct MAC_DownloadBuffer db;
|
struct MAC_DownloadBuffer db;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Actual information about the melt operation.
|
||||||
|
*/
|
||||||
|
struct MeltData *md;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -238,6 +564,7 @@ TALER_MINT_refresh_melt (struct TALER_MINT_Handle *mint,
|
|||||||
struct TALER_MINT_RefreshMeltHandle *rmh;
|
struct TALER_MINT_RefreshMeltHandle *rmh;
|
||||||
CURL *eh;
|
CURL *eh;
|
||||||
struct TALER_MINT_Context *ctx;
|
struct TALER_MINT_Context *ctx;
|
||||||
|
struct MeltData *md;
|
||||||
|
|
||||||
if (GNUNET_YES !=
|
if (GNUNET_YES !=
|
||||||
MAH_handle_is_ready (mint))
|
MAH_handle_is_ready (mint))
|
||||||
@ -245,7 +572,13 @@ TALER_MINT_refresh_melt (struct TALER_MINT_Handle *mint,
|
|||||||
GNUNET_break (0);
|
GNUNET_break (0);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/* FIXME: parse "refresh_data" */
|
md = deserialize_melt_data (refresh_data,
|
||||||
|
refresh_data_length);
|
||||||
|
if (NULL == md)
|
||||||
|
{
|
||||||
|
GNUNET_break (0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME: totally bogus request building here: */
|
/* FIXME: totally bogus request building here: */
|
||||||
melt_obj = json_pack ("{s:o, s:O}", /* f/wire */
|
melt_obj = json_pack ("{s:o, s:O}", /* f/wire */
|
||||||
@ -257,7 +590,7 @@ TALER_MINT_refresh_melt (struct TALER_MINT_Handle *mint,
|
|||||||
rmh->mint = mint;
|
rmh->mint = mint;
|
||||||
rmh->melt_cb = melt_cb;
|
rmh->melt_cb = melt_cb;
|
||||||
rmh->melt_cb_cls = melt_cb_cls;
|
rmh->melt_cb_cls = melt_cb_cls;
|
||||||
|
rmh->md = md;
|
||||||
rmh->url = MAH_path_to_url (mint,
|
rmh->url = MAH_path_to_url (mint,
|
||||||
"/refresh/melt");
|
"/refresh/melt");
|
||||||
|
|
||||||
@ -311,6 +644,8 @@ TALER_MINT_refresh_melt_cancel (struct TALER_MINT_RefreshMeltHandle *rmh)
|
|||||||
rmh->job = NULL;
|
rmh->job = NULL;
|
||||||
}
|
}
|
||||||
GNUNET_free_non_null (rmh->db.buf);
|
GNUNET_free_non_null (rmh->db.buf);
|
||||||
|
free_melt_data (rmh->md); /* does not free 'md' itself */
|
||||||
|
GNUNET_free (rmh->md);
|
||||||
GNUNET_free (rmh->url);
|
GNUNET_free (rmh->url);
|
||||||
GNUNET_free (rmh->json_enc);
|
GNUNET_free (rmh->json_enc);
|
||||||
GNUNET_free (rmh);
|
GNUNET_free (rmh);
|
||||||
@ -361,6 +696,10 @@ struct TALER_MINT_RefreshRevealHandle
|
|||||||
*/
|
*/
|
||||||
struct MAC_DownloadBuffer db;
|
struct MAC_DownloadBuffer db;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Actual information about the melt operation.
|
||||||
|
*/
|
||||||
|
struct MeltData *md;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -459,6 +798,7 @@ TALER_MINT_refresh_reveal (struct TALER_MINT_Handle *mint,
|
|||||||
json_t *reveal_obj;
|
json_t *reveal_obj;
|
||||||
CURL *eh;
|
CURL *eh;
|
||||||
struct TALER_MINT_Context *ctx;
|
struct TALER_MINT_Context *ctx;
|
||||||
|
struct MeltData *md;
|
||||||
|
|
||||||
if (GNUNET_YES !=
|
if (GNUNET_YES !=
|
||||||
MAH_handle_is_ready (mint))
|
MAH_handle_is_ready (mint))
|
||||||
@ -466,7 +806,13 @@ TALER_MINT_refresh_reveal (struct TALER_MINT_Handle *mint,
|
|||||||
GNUNET_break (0);
|
GNUNET_break (0);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/* FIXME: parse "refresh_data" */
|
md = deserialize_melt_data (refresh_data,
|
||||||
|
refresh_data_length);
|
||||||
|
if (NULL == md)
|
||||||
|
{
|
||||||
|
GNUNET_break (0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME: totally bogus request building here: */
|
/* FIXME: totally bogus request building here: */
|
||||||
reveal_obj = json_pack ("{s:o, s:O}", /* f/wire */
|
reveal_obj = json_pack ("{s:o, s:O}", /* f/wire */
|
||||||
@ -477,7 +823,7 @@ TALER_MINT_refresh_reveal (struct TALER_MINT_Handle *mint,
|
|||||||
rrh->mint = mint;
|
rrh->mint = mint;
|
||||||
rrh->reveal_cb = reveal_cb;
|
rrh->reveal_cb = reveal_cb;
|
||||||
rrh->reveal_cb_cls = reveal_cb_cls;
|
rrh->reveal_cb_cls = reveal_cb_cls;
|
||||||
|
rrh->md = md;
|
||||||
rrh->url = MAH_path_to_url (rrh->mint,
|
rrh->url = MAH_path_to_url (rrh->mint,
|
||||||
"/refresh/reveal");
|
"/refresh/reveal");
|
||||||
|
|
||||||
@ -533,6 +879,8 @@ TALER_MINT_refresh_reveal_cancel (struct TALER_MINT_RefreshRevealHandle *rrh)
|
|||||||
GNUNET_free_non_null (rrh->db.buf);
|
GNUNET_free_non_null (rrh->db.buf);
|
||||||
GNUNET_free (rrh->url);
|
GNUNET_free (rrh->url);
|
||||||
GNUNET_free (rrh->json_enc);
|
GNUNET_free (rrh->json_enc);
|
||||||
|
free_melt_data (rrh->md); /* does not free 'md' itself */
|
||||||
|
GNUNET_free (rrh->md);
|
||||||
GNUNET_free (rrh);
|
GNUNET_free (rrh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user