[WIP] exchangedb adjustments for denominations
- all prepared statements re: denominations now handle age_mask - signatures parameters adjusted. Now compiles and Tests run but fail. - good: we find denoms[] and age_restricted_denoms[] filled correctly in output to /keys - bad: fails at exchange_api_handle.c:882, signature verification of denom.
This commit is contained in:
parent
f8b1c3f8db
commit
d02b5e213a
@ -3037,6 +3037,7 @@ do_show (char *const *args)
|
||||
keys = parse_keys_input ("show");
|
||||
if (NULL == keys)
|
||||
return;
|
||||
|
||||
if (GNUNET_OK !=
|
||||
load_offline_key (GNUNET_NO))
|
||||
return;
|
||||
|
@ -743,33 +743,30 @@ static struct TALER_AgeMask
|
||||
load_age_mask (const char*section_name)
|
||||
{
|
||||
static const struct TALER_AgeMask null_mask = {0};
|
||||
struct TALER_AgeMask age_mask;
|
||||
|
||||
TALER_extensions_init ();
|
||||
age_mask = TALER_extensions_age_restriction_ageMask ();
|
||||
enum GNUNET_GenericReturnValue ret;
|
||||
struct TALER_AgeMask age_mask = TALER_extensions_age_restriction_ageMask ();
|
||||
|
||||
if (age_mask.mask == 0)
|
||||
return null_mask;
|
||||
|
||||
if (GNUNET_OK == (GNUNET_CONFIGURATION_have_value (
|
||||
if (GNUNET_OK != (GNUNET_CONFIGURATION_have_value (
|
||||
TEH_cfg,
|
||||
section_name,
|
||||
"AGE_RESTRICTED")))
|
||||
{
|
||||
enum GNUNET_GenericReturnValue ret;
|
||||
if (GNUNET_SYSERR == (ret = GNUNET_CONFIGURATION_get_value_yesno (TEH_cfg,
|
||||
section_name,
|
||||
"AGE_RESTRICTED")))
|
||||
{
|
||||
GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
|
||||
section_name,
|
||||
"AGE_RESTRICTED",
|
||||
"Value must be YES or NO\n");
|
||||
return null_mask;
|
||||
}
|
||||
}
|
||||
return null_mask;
|
||||
|
||||
return age_mask;
|
||||
ret = GNUNET_CONFIGURATION_get_value_yesno (TEH_cfg,
|
||||
section_name,
|
||||
"AGE_RESTRICTED");
|
||||
if (GNUNET_YES == ret)
|
||||
return age_mask;
|
||||
|
||||
if (GNUNET_SYSERR == ret)
|
||||
GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
|
||||
section_name,
|
||||
"AGE_RESTRICTED",
|
||||
"Value must be YES or NO\n");
|
||||
return null_mask;
|
||||
}
|
||||
|
||||
|
||||
@ -1177,6 +1174,8 @@ denomination_info_cb (
|
||||
dk->meta = *meta;
|
||||
dk->master_sig = *master_sig;
|
||||
dk->recoup_possible = recoup_possible;
|
||||
dk->denom_pub.age_mask = meta->age_mask;
|
||||
|
||||
GNUNET_assert (
|
||||
GNUNET_OK ==
|
||||
GNUNET_CONTAINER_multihashmap_put (ksh->denomkey_map,
|
||||
@ -1965,16 +1964,8 @@ finish_keys_response (struct TEH_KeyStateHandle *ksh)
|
||||
/* Put the denom into the correct array - denoms or age_restricted_denoms -
|
||||
* depending on the settings and the properties of the denomination */
|
||||
if (age_restriction_active &&
|
||||
(0 != dk->meta.age_mask.mask))
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
|
||||
"got agerestricted denom %p (mask %d) with mask %x (%s)\n",
|
||||
&dk->denom_pub,
|
||||
dk->denom_pub.age_mask.mask,
|
||||
dk->meta.age_mask.mask,
|
||||
TALER_age_mask_to_string (&dk->meta.age_mask));
|
||||
(0 != dk->denom_pub.age_mask.mask))
|
||||
array = age_restricted_denoms;
|
||||
}
|
||||
else
|
||||
array = denoms;
|
||||
|
||||
@ -2664,10 +2655,9 @@ load_extension_data (const char *section_name,
|
||||
TEH_currency);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
meta->age_mask = load_age_mask (section_name);
|
||||
if (0 != meta->age_mask.mask)
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "XXXX age mask is NON zero: %s!\n",
|
||||
TALER_age_mask_to_string (&meta->age_mask));
|
||||
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
|
@ -204,6 +204,7 @@ add_keys (void *cls,
|
||||
TALER_denom_pub_free (&denom_pub);
|
||||
return GNUNET_DB_STATUS_HARD_ERROR;
|
||||
}
|
||||
|
||||
if (is_active)
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||
@ -211,6 +212,7 @@ add_keys (void *cls,
|
||||
GNUNET_h2s (&d->h_denom_pub.hash));
|
||||
continue; /* skip, already known */
|
||||
}
|
||||
|
||||
qs = TEH_plugin->add_denomination_key (
|
||||
TEH_plugin->cls,
|
||||
&d->h_denom_pub,
|
||||
|
@ -25,7 +25,7 @@ CREATE TABLE IF NOT EXISTS denominations
|
||||
(denominations_serial BIGSERIAL UNIQUE
|
||||
,denom_pub_hash BYTEA PRIMARY KEY CHECK (LENGTH(denom_pub_hash)=64)
|
||||
,denom_type INT4 NOT NULL DEFAULT (1) -- 1 == RSA (for now, remove default later!)
|
||||
,age_restrictions INT4 NOT NULL DEFAULT (0)
|
||||
,age_mask INT4 NOT NULL DEFAULT (0)
|
||||
,denom_pub BYTEA NOT NULL
|
||||
,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
|
||||
,valid_from INT8 NOT NULL
|
||||
@ -47,7 +47,7 @@ COMMENT ON TABLE denominations
|
||||
IS 'Main denominations table. All the valid denominations the exchange knows about.';
|
||||
COMMENT ON COLUMN denominations.denom_type
|
||||
IS 'determines cipher type for blind signatures used with this denomination; 0 is for RSA';
|
||||
COMMENT ON COLUMN denominations.age_restrictions
|
||||
COMMENT ON COLUMN denominations.age_mask
|
||||
IS 'bitmask with the age restrictions that are being used for this denomination; 0 if denomination does not support the use of age restrictions';
|
||||
COMMENT ON COLUMN denominations.denominations_serial
|
||||
IS 'needed for exchange-auditor replication logic';
|
||||
|
@ -231,10 +231,11 @@ prepare_statements (struct PostgresClosure *pg)
|
||||
",fee_refresh_frac"
|
||||
",fee_refund_val"
|
||||
",fee_refund_frac"
|
||||
",age_mask"
|
||||
") VALUES "
|
||||
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10,"
|
||||
" $11, $12, $13, $14, $15, $16, $17);",
|
||||
17),
|
||||
" $11, $12, $13, $14, $15, $16, $17, $18);",
|
||||
18),
|
||||
/* Used in #postgres_iterate_denomination_info() */
|
||||
GNUNET_PQ_make_prepare (
|
||||
"denomination_iterate",
|
||||
@ -255,6 +256,7 @@ prepare_statements (struct PostgresClosure *pg)
|
||||
",fee_refund_val"
|
||||
",fee_refund_frac"
|
||||
",denom_pub"
|
||||
",age_mask"
|
||||
" FROM denominations;",
|
||||
0),
|
||||
/* Used in #postgres_iterate_denominations() */
|
||||
@ -278,6 +280,7 @@ prepare_statements (struct PostgresClosure *pg)
|
||||
",fee_refund_val"
|
||||
",fee_refund_frac"
|
||||
",denom_pub"
|
||||
",age_mask"
|
||||
" FROM denominations"
|
||||
" LEFT JOIN "
|
||||
" denomination_revocations USING (denominations_serial);",
|
||||
@ -341,6 +344,7 @@ prepare_statements (struct PostgresClosure *pg)
|
||||
",fee_refresh_frac"
|
||||
",fee_refund_val"
|
||||
",fee_refund_frac"
|
||||
",age_mask"
|
||||
" FROM denominations"
|
||||
" WHERE denom_pub_hash=$1;",
|
||||
1),
|
||||
@ -2071,7 +2075,6 @@ prepare_statements (struct PostgresClosure *pg)
|
||||
"SELECT"
|
||||
" denominations_serial AS serial"
|
||||
",denom_type"
|
||||
",age_restrictions"
|
||||
",denom_pub"
|
||||
",master_sig"
|
||||
",valid_from"
|
||||
@ -2088,6 +2091,7 @@ prepare_statements (struct PostgresClosure *pg)
|
||||
",fee_refresh_frac"
|
||||
",fee_refund_val"
|
||||
",fee_refund_frac"
|
||||
",age_mask"
|
||||
" FROM denominations"
|
||||
" WHERE denominations_serial > $1"
|
||||
" ORDER BY denominations_serial ASC;",
|
||||
@ -2390,10 +2394,11 @@ prepare_statements (struct PostgresClosure *pg)
|
||||
",fee_refresh_frac"
|
||||
",fee_refund_val"
|
||||
",fee_refund_frac"
|
||||
",age_mask"
|
||||
") VALUES "
|
||||
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10,"
|
||||
" $11, $12, $13, $14, $15, $16, $17, $18);",
|
||||
18),
|
||||
" $11, $12, $13, $14, $15, $16, $17, $18, $19);",
|
||||
19),
|
||||
GNUNET_PQ_make_prepare (
|
||||
"insert_into_table_denomination_revocations",
|
||||
"INSERT INTO denomination_revocations"
|
||||
@ -3096,9 +3101,12 @@ postgres_insert_denomination_info (
|
||||
TALER_PQ_query_param_amount_nbo (&issue->properties.fee_deposit),
|
||||
TALER_PQ_query_param_amount_nbo (&issue->properties.fee_refresh),
|
||||
TALER_PQ_query_param_amount_nbo (&issue->properties.fee_refund),
|
||||
GNUNET_PQ_query_param_uint32 (&denom_pub->age_mask.mask),
|
||||
GNUNET_PQ_query_param_end
|
||||
};
|
||||
|
||||
GNUNET_assert (denom_pub->age_mask.mask == issue->age_mask.mask);
|
||||
|
||||
GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
|
||||
GNUNET_TIME_timestamp_ntoh (
|
||||
issue->properties.start).abs_time));
|
||||
@ -3172,6 +3180,8 @@ postgres_get_denomination_info (
|
||||
&issue->properties.fee_refresh),
|
||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_refund",
|
||||
&issue->properties.fee_refund),
|
||||
GNUNET_PQ_result_spec_uint32 ("age_mask",
|
||||
&issue->age_mask.mask),
|
||||
GNUNET_PQ_result_spec_end
|
||||
};
|
||||
|
||||
@ -3258,12 +3268,15 @@ domination_cb_helper (void *cls,
|
||||
&issue.properties.fee_refund),
|
||||
TALER_PQ_result_spec_denom_pub ("denom_pub",
|
||||
&denom_pub),
|
||||
GNUNET_PQ_result_spec_uint32 ("age_mask",
|
||||
&issue.age_mask.mask),
|
||||
GNUNET_PQ_result_spec_end
|
||||
};
|
||||
|
||||
memset (&issue.properties.master,
|
||||
0,
|
||||
sizeof (issue.properties.master));
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_PQ_extract_result (result,
|
||||
rs,
|
||||
@ -3272,6 +3285,13 @@ domination_cb_helper (void *cls,
|
||||
GNUNET_break (0);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Unfortunately we have to carry the age mask in both, the
|
||||
* TALER_DenominationPublicKey and
|
||||
* TALER_EXCHANGEDB_DenominationKeyInformationP at different times.
|
||||
* Here we use _both_ so let's make sure the values are the same. */
|
||||
denom_pub.age_mask = issue.age_mask;
|
||||
|
||||
issue.properties.purpose.size
|
||||
= htonl (sizeof (struct TALER_DenominationKeyValidityPS));
|
||||
issue.properties.purpose.purpose
|
||||
@ -3387,6 +3407,8 @@ dominations_cb_helper (void *cls,
|
||||
&meta.fee_refund),
|
||||
TALER_PQ_result_spec_denom_pub ("denom_pub",
|
||||
&denom_pub),
|
||||
GNUNET_PQ_result_spec_uint32 ("age_mask",
|
||||
&meta.age_mask.mask),
|
||||
GNUNET_PQ_result_spec_end
|
||||
};
|
||||
|
||||
@ -3398,6 +3420,10 @@ dominations_cb_helper (void *cls,
|
||||
GNUNET_break (0);
|
||||
return;
|
||||
}
|
||||
|
||||
/* make sure the mask information is the same */
|
||||
denom_pub.age_mask = meta.age_mask;
|
||||
|
||||
TALER_denom_pub_hash (&denom_pub,
|
||||
&h_denom_pub);
|
||||
dic->cb (dic->cb_cls,
|
||||
@ -10193,6 +10219,8 @@ postgres_lookup_denomination_key (
|
||||
&meta->fee_refresh),
|
||||
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_refund",
|
||||
&meta->fee_refund),
|
||||
GNUNET_PQ_result_spec_uint32 ("age_mask",
|
||||
&meta->age_mask.mask),
|
||||
GNUNET_PQ_result_spec_end
|
||||
};
|
||||
|
||||
@ -10236,6 +10264,7 @@ postgres_add_denomination_key (
|
||||
TALER_PQ_query_param_amount (&meta->fee_deposit),
|
||||
TALER_PQ_query_param_amount (&meta->fee_refresh),
|
||||
TALER_PQ_query_param_amount (&meta->fee_refund),
|
||||
GNUNET_PQ_query_param_uint32 (&meta->age_mask.mask),
|
||||
GNUNET_PQ_query_param_end
|
||||
};
|
||||
|
||||
|
@ -70,6 +70,12 @@ struct TALER_EXCHANGEDB_DenominationKeyInformationP
|
||||
* Signed properties of the denomination key.
|
||||
*/
|
||||
struct TALER_DenominationKeyValidityPS properties;
|
||||
|
||||
/**
|
||||
* If denomination was setup for age restriction, non-zero age mask.
|
||||
* Note that the mask is not part of the signature.
|
||||
*/
|
||||
struct TALER_AgeMask age_mask;
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user