Actuall call TALER_age_commitment_derive
...from within TALER_EXCHANGE_refresh_prepare
This commit is contained in:
parent
d42394de9b
commit
e41c71f6ea
@ -2681,7 +2681,7 @@ TALER_age_restriction_commit (
|
||||
* @return GNUNET_OK on success, GNUNET_SYSERR otherwise
|
||||
*/
|
||||
enum GNUNET_GenericReturnValue
|
||||
TALER_age_restriction_derive (
|
||||
TALER_age_commitment_derive (
|
||||
const struct TALER_AgeCommitment *orig,
|
||||
const uint32_t seed,
|
||||
struct TALER_AgeCommitment *derived);
|
||||
|
@ -445,6 +445,8 @@ TALER_EXCHANGE_refresh_prepare (
|
||||
struct TALER_PlanchetDetail pd;
|
||||
struct TALER_CoinPubHash c_hash;
|
||||
|
||||
|
||||
/* Handle age commitment, if present */
|
||||
if (NULL == age_commitment)
|
||||
{
|
||||
memset (ach, 0, sizeof(struct TALER_AgeCommitmentHash));
|
||||
@ -452,10 +454,26 @@ TALER_EXCHANGE_refresh_prepare (
|
||||
}
|
||||
else
|
||||
{
|
||||
GNUNET_break_op (0);
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
|
||||
"Age Commitment provided, but not supported");
|
||||
// FIXME-oec: Fill &md.fresh_ach[i][j];
|
||||
struct TALER_AgeCommitment new_ac;
|
||||
uint32_t seed;
|
||||
|
||||
/* we use the first 4 bytes of the trans_sec to generate a new age
|
||||
* commitment */
|
||||
seed = *(uint32_t *) trans_sec[i].key.bits;
|
||||
|
||||
if (GNUNET_OK != TALER_age_commitment_derive (
|
||||
age_commitment,
|
||||
seed,
|
||||
&new_ac))
|
||||
{
|
||||
GNUNET_break_op (0);
|
||||
TALER_EXCHANGE_free_melt_data_ (&md);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
TALER_age_commitment_hash (
|
||||
&new_ac,
|
||||
&md.fresh_ach[i][j]);
|
||||
}
|
||||
|
||||
TALER_planchet_setup_refresh (&trans_sec[i],
|
||||
|
@ -402,8 +402,93 @@ TALER_age_commitment_hash (
|
||||
}
|
||||
|
||||
|
||||
/* To a given age value between 0 and 31, returns the index of the age group
|
||||
* defined by the given mask.
|
||||
*/
|
||||
static uint8_t
|
||||
get_age_group (
|
||||
const struct TALER_AgeMask *mask,
|
||||
uint8_t age)
|
||||
{
|
||||
uint32_t m = mask->mask;
|
||||
uint8_t i = 0;
|
||||
|
||||
while (m > 0)
|
||||
{
|
||||
if (0 >= age)
|
||||
break;
|
||||
m = m >> 1;
|
||||
i += m & 1;
|
||||
age--;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
enum GNUNET_GenericReturnValue
|
||||
TALER_age_restriction_derive (
|
||||
TALER_age_restriction_commit (
|
||||
const struct TALER_AgeMask *mask,
|
||||
const uint8_t age,
|
||||
const uint32_t seed,
|
||||
struct TALER_AgeCommitment *new)
|
||||
{
|
||||
uint8_t num_pub = __builtin_popcount (mask->mask) - 1;
|
||||
uint8_t num_priv = get_age_group (mask, age) - 1;
|
||||
size_t i;
|
||||
|
||||
GNUNET_assert (NULL != new);
|
||||
GNUNET_assert (mask->mask & 1); /* fist bit must have been set */
|
||||
GNUNET_assert (0 <= num_priv);
|
||||
GNUNET_assert (31 > num_priv);
|
||||
|
||||
new->mask.mask = mask->mask;
|
||||
new->num_pub = num_pub;
|
||||
new->num_priv = num_priv;
|
||||
|
||||
new->pub = GNUNET_new_array (
|
||||
num_pub,
|
||||
struct TALER_AgeCommitmentPublicKeyP);
|
||||
new->priv = GNUNET_new_array (
|
||||
num_priv,
|
||||
struct TALER_AgeCommitmentPrivateKeyP);
|
||||
|
||||
/* Create as many private keys as we need */
|
||||
for (i = 0; i < num_priv; i++)
|
||||
{
|
||||
uint32_t seedBE = htonl (seed + i);
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CRYPTO_kdf (&new->priv[i],
|
||||
sizeof (new->priv[i]),
|
||||
&seedBE,
|
||||
sizeof (seedBE),
|
||||
"taler-age-commitment-derivation",
|
||||
strlen (
|
||||
"taler-age-commitment-derivation"),
|
||||
NULL, 0))
|
||||
goto FAIL;
|
||||
|
||||
GNUNET_CRYPTO_eddsa_key_get_public (&new->priv[i].eddsa_priv,
|
||||
&new->pub[i].eddsa_pub);
|
||||
}
|
||||
|
||||
/* Fill the rest of the public keys with random values */
|
||||
for (; i<num_pub; i++)
|
||||
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
|
||||
&new->pub[i],
|
||||
sizeof(new->pub[i]));
|
||||
|
||||
return GNUNET_OK;
|
||||
|
||||
FAIL:
|
||||
GNUNET_free (new->pub);
|
||||
GNUNET_free (new->priv);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
|
||||
enum GNUNET_GenericReturnValue
|
||||
TALER_age_commitment_derive (
|
||||
const struct TALER_AgeCommitment *orig,
|
||||
const uint32_t seed,
|
||||
struct TALER_AgeCommitment *new)
|
||||
@ -526,91 +611,6 @@ FAIL:
|
||||
}
|
||||
|
||||
|
||||
/* To a given age value between 0 and 31, returns the index of the age group
|
||||
* defined by the given mask.
|
||||
*/
|
||||
static uint8_t
|
||||
get_age_group (
|
||||
const struct TALER_AgeMask *mask,
|
||||
uint8_t age)
|
||||
{
|
||||
uint32_t m = mask->mask;
|
||||
uint8_t i = 0;
|
||||
|
||||
while (m > 0)
|
||||
{
|
||||
if (0 >= age)
|
||||
break;
|
||||
m = m >> 1;
|
||||
i += m & 1;
|
||||
age--;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
enum GNUNET_GenericReturnValue
|
||||
TALER_age_restriction_commit (
|
||||
const struct TALER_AgeMask *mask,
|
||||
const uint8_t age,
|
||||
const uint32_t seed,
|
||||
struct TALER_AgeCommitment *new)
|
||||
{
|
||||
uint8_t num_pub = __builtin_popcount (mask->mask) - 1;
|
||||
uint8_t num_priv = get_age_group (mask, age) - 1;
|
||||
size_t i;
|
||||
|
||||
GNUNET_assert (NULL != new);
|
||||
GNUNET_assert (mask->mask & 1); /* fist bit must have been set */
|
||||
GNUNET_assert (0 <= num_priv);
|
||||
GNUNET_assert (31 > num_priv);
|
||||
|
||||
new->mask.mask = mask->mask;
|
||||
new->num_pub = num_pub;
|
||||
new->num_priv = num_priv;
|
||||
|
||||
new->pub = GNUNET_new_array (
|
||||
num_pub,
|
||||
struct TALER_AgeCommitmentPublicKeyP);
|
||||
new->priv = GNUNET_new_array (
|
||||
num_priv,
|
||||
struct TALER_AgeCommitmentPrivateKeyP);
|
||||
|
||||
/* Create as many private keys as we need */
|
||||
for (i = 0; i < num_priv; i++)
|
||||
{
|
||||
uint32_t seedBE = htonl (seed + i);
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CRYPTO_kdf (&new->priv[i],
|
||||
sizeof (new->priv[i]),
|
||||
&seedBE,
|
||||
sizeof (seedBE),
|
||||
"taler-age-commitment-derivation",
|
||||
strlen (
|
||||
"taler-age-commitment-derivation"),
|
||||
NULL, 0))
|
||||
goto FAIL;
|
||||
|
||||
GNUNET_CRYPTO_eddsa_key_get_public (&new->priv[i].eddsa_priv,
|
||||
&new->pub[i].eddsa_pub);
|
||||
}
|
||||
|
||||
/* Fill the rest of the public keys with random values */
|
||||
for (; i<num_pub; i++)
|
||||
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
|
||||
&new->pub[i],
|
||||
sizeof(new->pub[i]));
|
||||
|
||||
return GNUNET_OK;
|
||||
|
||||
FAIL:
|
||||
GNUNET_free (new->pub);
|
||||
GNUNET_free (new->priv);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
TALER_age_restriction_commmitment_free_inside (
|
||||
struct TALER_AgeCommitment *commitment)
|
||||
|
Loading…
Reference in New Issue
Block a user