more work on /refresh skeleton and internal data structures

This commit is contained in:
Christian Grothoff 2015-08-06 16:40:21 +02:00
parent 6418724aad
commit c4f75cfc1b

View File

@ -33,6 +33,321 @@
/* ********************* /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
@ -87,9 +402,16 @@ TALER_MINT_refresh_prepare (unsigned int num_melts,
const struct TALER_MINT_DenomPublicKey *fresh_pks,
size_t *res_size)
{
struct MeltData md;
char *buf;
GNUNET_break (0); // FIXME: not implemented
*res_size = 0;
return NULL;
// FIXME: init 'md' here!
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;
/**
* 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;
CURL *eh;
struct TALER_MINT_Context *ctx;
struct MeltData *md;
if (GNUNET_YES !=
MAH_handle_is_ready (mint))
@ -245,7 +572,13 @@ TALER_MINT_refresh_melt (struct TALER_MINT_Handle *mint,
GNUNET_break (0);
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: */
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->melt_cb = melt_cb;
rmh->melt_cb_cls = melt_cb_cls;
rmh->md = md;
rmh->url = MAH_path_to_url (mint,
"/refresh/melt");
@ -311,6 +644,8 @@ TALER_MINT_refresh_melt_cancel (struct TALER_MINT_RefreshMeltHandle *rmh)
rmh->job = NULL;
}
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->json_enc);
GNUNET_free (rmh);
@ -361,6 +696,10 @@ struct TALER_MINT_RefreshRevealHandle
*/
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;
CURL *eh;
struct TALER_MINT_Context *ctx;
struct MeltData *md;
if (GNUNET_YES !=
MAH_handle_is_ready (mint))
@ -466,7 +806,13 @@ TALER_MINT_refresh_reveal (struct TALER_MINT_Handle *mint,
GNUNET_break (0);
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: */
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->reveal_cb = reveal_cb;
rrh->reveal_cb_cls = reveal_cb_cls;
rrh->md = md;
rrh->url = MAH_path_to_url (rrh->mint,
"/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 (rrh->url);
GNUNET_free (rrh->json_enc);
free_melt_data (rrh->md); /* does not free 'md' itself */
GNUNET_free (rrh->md);
GNUNET_free (rrh);
}