commit 95de67adc9e72b23c3e6d62c1966e0bcba411efd
parent 29bd28c4985d402eca0bd49e63236f222a730d49
Author: Matyja Lukas Adam <lukas.matyja@students.bfh.ch>
Date: Mon, 18 Mar 2024 11:31:15 +0100
Merge remote-tracking branch 'refs/remotes/origin/master'
Diffstat:
6 files changed, 51 insertions(+), 991 deletions(-)
diff --git a/src/donau/donau-httpd_keys.c b/src/donau/donau-httpd_keys.c
@@ -623,11 +623,21 @@ insert_donation_unit_cb (void *cls,
du = GNUNET_CONTAINER_multihashmap_get (
kbc->ksh->donation_unit_map,
h_du_pub);
+
if (NULL != du)
return GNUNET_OK; /* skip: this key is already active! */
+
// if (GNUNET_TIME_relative_is_zero (hd->validity_duration))
// return GNUNET_OK; /* this key already expired! */
+ // if (GNUNET_OK !=
+ // load_extension_data (hd->section_name,
+ // &meta))
+ // {
+ // /* Woops, couldn't determine fee structure!? */
+ // return GNUNET_OK;
+ // }
+
GNUNET_assert (
0 == json_array_append_new (
kbc->donation_units,
@@ -652,7 +662,7 @@ insert_donation_unit_cb (void *cls,
* and @a denoms.
*
* @param[in,out] ksh key state handle we build @a krd for
- * @param[in] h_donation_unit_pub hash over all the denomination keys in @a denoms
+ * @param[in] du_keys_hash hash over all the denomination keys in @a denoms
* @param last_cherry_pick_date timestamp to use
* @param[in,out] signkeys list of sign keys to return
* @param[in,out] grouped_donation_units list of grouped denominations to return
@@ -660,7 +670,7 @@ insert_donation_unit_cb (void *cls,
*/
static enum GNUNET_GenericReturnValue
create_krd (struct DH_KeyStateHandle *ksh,
- const struct GNUNET_HashCode *h_du_pub,
+ const struct GNUNET_HashCode *du_keys_hash,
struct GNUNET_TIME_Timestamp last_cherry_pick_date,
json_t *signkeys,
json_t *grouped_donation_units)
@@ -680,18 +690,18 @@ create_krd (struct DH_KeyStateHandle *ksh,
"Creating /keys at cherry pick date %s\n",
GNUNET_TIME_timestamp2s (last_cherry_pick_date));
- // /* Sign hash over master signatures of all denomination keys until this time
- // (in reverse order). */
+ /* Sign hash over master signatures of all denomination keys until this time
+ (in reverse order). */
// {
- // enum TALER_ErrorCode ec;
+ // enum TALER_ErrorCode ec;
//
// if (TALER_EC_NONE !=
// (ec =
- // TALER_donau_online_key_set_sign (
+ // DONAU_donau_online_key_set_sign (
// &TEH_keys_donau_sign2_,
// ksh,
// last_cherry_pick_date,
- // h_donation_unit_pub,
+ // du_keys_hash,
// &donau_pub,
// &donau_sig)))
// {
@@ -701,17 +711,17 @@ create_krd (struct DH_KeyStateHandle *ksh,
// return GNUNET_SYSERR;
// }
// }
-
- {
- const struct SigningKey *sk;
-
- sk = GNUNET_CONTAINER_multipeermap_get (ksh->signkey_map,
- (const struct GNUNET_PeerIdentity *)
- &donau_pub);
-
- ksh->signature_expires = GNUNET_TIME_timestamp_min (sk->meta.expire_sign,
- ksh->signature_expires);
- }
+ //
+ // {
+ // const struct SigningKey *sk;
+ //
+ // sk = GNUNET_CONTAINER_multipeermap_get (ksh->signkey_map,
+ // (const struct GNUNET_PeerIdentity *)
+ // &donau_pub);
+ //
+ // ksh->signature_expires = GNUNET_TIME_timestamp_min (sk->meta.expire_sign,
+ // ksh->signature_expires);
+ // }
keys = GNUNET_JSON_PACK (
GNUNET_JSON_pack_string ("version",
@@ -1083,6 +1093,7 @@ finish_keys_response (struct DH_KeyStateHandle *ksh)
// group->group_off,
// (unsigned int) json_array_size (group->list),
// &dk->master_sig);
+
/* Finally, add the denomination to the list of donation_units in this
group */
GNUNET_assert (json_is_array (group->list));
@@ -1324,14 +1335,13 @@ check_esign_sm_pub (const struct TALER_SecurityModulePublicKeyP *sm_pub)
*/
static enum GNUNET_GenericReturnValue
free_donation_unit_cb (void *cls,
- const struct DONAU_DonationUnitHashP *h_donation_unit_pub
- ,
+ const struct GNUNET_HashCode *h_du_pub,
void *value)
{
struct HelperDonationUnit *hd = value;
(void) cls;
- (void) h_donation_unit_pub;
+ (void) h_du_pub;
DONAU_donation_unit_pub_free (&hd->donation_unit_pub);
GNUNET_free (hd->section_name);
GNUNET_free (hd);
@@ -1518,8 +1528,12 @@ helper_rsa_cb (
&value);
if (qs < 0)
{
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Failed to insert donation units\n");
// FIXME: error, probably should not proceed...
}
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Inserted donation unit of %s\n",
+ TALER_amount2s (&value));
hd->section_name = GNUNET_strdup (section_name);
GNUNET_assert (
GNUNET_OK ==
@@ -1619,9 +1633,12 @@ helper_cs_cb (
&value);
if (qs < 0)
{
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Failed to insert donation units\n");
// FIXME: error, probably should not proceed...
}
-
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Inserted donation unit of %s\n",
+ TALER_amount2s (&value));
hd->section_name = GNUNET_strdup (section_name);
GNUNET_assert (
GNUNET_OK ==
@@ -1979,7 +1996,7 @@ DH_keys_update_states ()
NULL,
0);
key_generation++;
- // DH_resume_keys_requests (false);
+ DH_resume_keys_requests (false);
}
diff --git a/src/donaudb/0002-donation_units.sql b/src/donaudb/0002-donation_units.sql
@@ -18,7 +18,7 @@ CREATE TABLE donation_units
(donation_unit_serial BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
,h_donation_unit_pub BYTEA PRIMARY KEY CHECK (LENGTH(h_donation_unit_pub)=64)
,donation_unit_pub BYTEA UNIQUE NOT NULL
- ,validity_year INT4 NOT NULL
+ ,validity_year INT8 NOT NULL
,value taler_amount NOT NULL
);
COMMENT ON TABLE donation_units
@@ -26,6 +26,6 @@ COMMENT ON TABLE donation_units
COMMENT ON COLUMN donation_units.value
IS 'Value the donation unit has in Taler amount';
-CREATE INDEX donation_units_by_validity_year
- ON donation_units
- (validity_year);
+-- CREATE INDEX IF NOT EXISTS donation_units_by_validity_year
+-- ON donation_units
+-- (validity_year);
diff --git a/src/donaudb/pg_insert_donation_unit.c b/src/donaudb/pg_insert_donation_unit.c
@@ -31,8 +31,8 @@ DH_PG_insert_donation_unit (
void *cls,
const struct DONAU_DonationUnitHashP *h_donation_unit_pub,
const struct DONAU_DonationUnitPublicKey *donation_unit_pub,
- uint64_t validity_year,
- struct TALER_Amount *value)
+ const uint64_t validity_year,
+ const struct TALER_Amount *value)
{
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam iparams[] = {
@@ -50,8 +50,7 @@ DH_PG_insert_donation_unit (
",donation_unit_pub"
",validity_year"
",value"
- ") VALUES "
- "($1, $2, $3, $4);");
+ ") VALUES ($1, $2, $3, $4);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"donation_unit_insert",
iparams);
diff --git a/src/donaudb/pg_insert_donation_unit.h b/src/donaudb/pg_insert_donation_unit.h
@@ -40,7 +40,7 @@ DH_PG_insert_donation_unit (
void *cls,
const struct DONAU_DonationUnitHashP *h_donation_unit_pub,
const struct DONAU_DonationUnitPublicKey *donation_unit_pub,
- uint64_t validity_year,
- struct TALER_Amount *value);
+ const uint64_t validity_year,
+ const struct TALER_Amount *value);
#endif
diff --git a/src/include/donaudb_plugin.h b/src/include/donaudb_plugin.h
@@ -450,8 +450,8 @@ struct DONAUDB_Plugin
void *cls,
const struct DONAU_DonationUnitHashP *h_donation_unit_pub,
const struct DONAU_DonationUnitPublicKey *donation_unit_pub,
- uint64_t validity_year,
- struct TALER_Amount *value);
+ const uint64_t validity_year,
+ const struct TALER_Amount *value);
/**
* Insert history entry of a charity
diff --git a/src/json/json_helper.c b/src/json/json_helper.c
@@ -270,77 +270,6 @@ TALER_JSON_spec_currency_specification (
}
-static enum GNUNET_GenericReturnValue
-parse_denomination_group (void *cls,
- json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_DenominationGroup *group = spec->ptr;
- const char *cipher;
- const char *currency = cls;
- bool age_mask_missing = false;
- bool has_age_restricted_suffix = false;
- struct GNUNET_JSON_Specification gspec[] = {
- GNUNET_JSON_spec_string ("cipher",
- &cipher),
- TALER_JSON_spec_amount ("value",
- currency,
- &group->value),
- TALER_JSON_SPEC_DENOM_FEES ("fee",
- currency,
- &group->fees),
- GNUNET_JSON_spec_mark_optional (
- GNUNET_JSON_spec_uint32 ("age_mask",
- &group->age_mask.bits),
- &age_mask_missing),
- GNUNET_JSON_spec_end ()
- };
- const char *emsg;
- unsigned int eline;
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- gspec,
- &emsg,
- &eline))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Failed to parse %s at %u: %s\n",
- spec[eline].field,
- eline,
- emsg);
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
-
- group->cipher = string_to_cipher (cipher);
- if (GNUNET_CRYPTO_BSA_INVALID == group->cipher)
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
-
- return GNUNET_OK;
-}
-
-
-struct GNUNET_JSON_Specification
-TALER_JSON_spec_denomination_group (const char *name,
- const char *currency,
- struct TALER_DenominationGroup *group)
-{
- struct GNUNET_JSON_Specification ret = {
- .cls = (void *) currency,
- .parser = &parse_denomination_group,
- .field = name,
- .ptr = group,
- .ptr_size = sizeof(*group)
- };
-
- return ret;
-}
-
-
/**
* Parse given JSON object to an encrypted contract.
*
@@ -415,841 +344,6 @@ TALER_JSON_spec_econtract (const char *name,
/**
- * Parse given JSON object to an age commitmnet
- *
- * @param cls closure, NULL
- * @param root the json object representing data
- * @param[out] spec where to write the data
- * @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
- */
-static enum GNUNET_GenericReturnValue
-parse_age_commitment (void *cls,
- json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_AgeCommitment *age_commitment = spec->ptr;
- json_t *pk;
- unsigned int idx;
- size_t num;
-
- (void) cls;
- if ( (NULL == root) ||
- (! json_is_array (root)))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
-
- num = json_array_size (root);
- if (32 <= num || 0 == num)
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
-
- age_commitment->num = num;
- age_commitment->keys =
- GNUNET_new_array (num,
- struct TALER_AgeCommitmentPublicKeyP);
-
- json_array_foreach (root, idx, pk) {
- const char *emsg;
- unsigned int eline;
- struct GNUNET_JSON_Specification pkspec[] = {
- GNUNET_JSON_spec_fixed_auto (
- NULL,
- &age_commitment->keys[idx].pub),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (pk,
- pkspec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_JSON_parse_free (spec);
- return GNUNET_SYSERR;
- }
- };
-
- return GNUNET_OK;
-}
-
-
-/**
- * Cleanup data left from parsing age commitment
- *
- * @param cls closure, NULL
- * @param[out] spec where to free the data
- */
-static void
-clean_age_commitment (void *cls,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_AgeCommitment *age_commitment = spec->ptr;
-
- (void) cls;
-
- if (NULL == age_commitment ||
- NULL == age_commitment->keys)
- return;
-
- age_commitment->num = 0;
- GNUNET_free (age_commitment->keys);
-}
-
-
-struct GNUNET_JSON_Specification
-TALER_JSON_spec_age_commitment (const char *name,
- struct TALER_AgeCommitment *age_commitment)
-{
- struct GNUNET_JSON_Specification ret = {
- .parser = &parse_age_commitment,
- .cleaner = &clean_age_commitment,
- .field = name,
- .ptr = age_commitment
- };
-
- return ret;
-}
-
-
-/**
- * Parse given JSON object to denomination public key.
- *
- * @param cls closure, NULL
- * @param root the json object representing data
- * @param[out] spec where to write the data
- * @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
- */
-static enum GNUNET_GenericReturnValue
-parse_denom_pub (void *cls,
- json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_DenominationPublicKey *denom_pub = spec->ptr;
- struct GNUNET_CRYPTO_BlindSignPublicKey *bsign_pub;
- const char *cipher;
- bool age_mask_missing = false;
- struct GNUNET_JSON_Specification dspec[] = {
- GNUNET_JSON_spec_string ("cipher",
- &cipher),
- GNUNET_JSON_spec_mark_optional (
- GNUNET_JSON_spec_uint32 ("age_mask",
- &denom_pub->age_mask.bits),
- &age_mask_missing),
- GNUNET_JSON_spec_end ()
- };
- const char *emsg;
- unsigned int eline;
-
- (void) cls;
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- dspec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
-
- if (age_mask_missing)
- denom_pub->age_mask.bits = 0;
- bsign_pub = GNUNET_new (struct GNUNET_CRYPTO_BlindSignPublicKey);
- bsign_pub->rc = 1;
- bsign_pub->cipher = string_to_cipher (cipher);
- switch (bsign_pub->cipher)
- {
- case GNUNET_CRYPTO_BSA_INVALID:
- break;
- case GNUNET_CRYPTO_BSA_RSA:
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_rsa_public_key (
- "rsa_public_key",
- &bsign_pub->details.rsa_public_key),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (bsign_pub);
- return GNUNET_SYSERR;
- }
- denom_pub->bsign_pub_key = bsign_pub;
- return GNUNET_OK;
- }
- case GNUNET_CRYPTO_BSA_CS:
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_fixed ("cs_public_key",
- &bsign_pub->details.cs_public_key,
- sizeof (bsign_pub->details.cs_public_key)),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (bsign_pub);
- return GNUNET_SYSERR;
- }
- denom_pub->bsign_pub_key = bsign_pub;
- return GNUNET_OK;
- }
- }
- GNUNET_break_op (0);
- GNUNET_free (bsign_pub);
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Cleanup data left from parsing denomination public key.
- *
- * @param cls closure, NULL
- * @param[out] spec where to free the data
- */
-static void
-clean_denom_pub (void *cls,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_DenominationPublicKey *denom_pub = spec->ptr;
-
- (void) cls;
- TALER_denom_pub_free (denom_pub);
-}
-
-
-struct GNUNET_JSON_Specification
-TALER_JSON_spec_denom_pub (const char *field,
- struct TALER_DenominationPublicKey *pk)
-{
- struct GNUNET_JSON_Specification ret = {
- .parser = &parse_denom_pub,
- .cleaner = &clean_denom_pub,
- .field = field,
- .ptr = pk
- };
-
- pk->bsign_pub_key = NULL;
- return ret;
-}
-
-
-/**
- * Parse given JSON object partially into a denomination public key.
- *
- * Depending on the cipher in cls, it parses the corresponding public key type.
- *
- * @param cls closure, enum GNUNET_CRYPTO_BlindSignatureAlgorithm
- * @param root the json object representing data
- * @param[out] spec where to write the data
- * @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
- */
-static enum GNUNET_GenericReturnValue
-parse_denom_pub_cipher (void *cls,
- json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_DenominationPublicKey *denom_pub = spec->ptr;
- enum GNUNET_CRYPTO_BlindSignatureAlgorithm cipher =
- (enum GNUNET_CRYPTO_BlindSignatureAlgorithm) (long) cls;
- struct GNUNET_CRYPTO_BlindSignPublicKey *bsign_pub;
- const char *emsg;
- unsigned int eline;
-
- bsign_pub = GNUNET_new (struct GNUNET_CRYPTO_BlindSignPublicKey);
- bsign_pub->cipher = cipher;
- bsign_pub->rc = 1;
- switch (cipher)
- {
- case GNUNET_CRYPTO_BSA_INVALID:
- break;
- case GNUNET_CRYPTO_BSA_RSA:
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_rsa_public_key (
- "rsa_pub",
- &bsign_pub->details.rsa_public_key),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (bsign_pub);
- return GNUNET_SYSERR;
- }
- denom_pub->bsign_pub_key = bsign_pub;
- return GNUNET_OK;
- }
- case GNUNET_CRYPTO_BSA_CS:
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_fixed ("cs_pub",
- &bsign_pub->details.cs_public_key,
- sizeof (bsign_pub->details.cs_public_key)),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (bsign_pub);
- return GNUNET_SYSERR;
- }
- denom_pub->bsign_pub_key = bsign_pub;
- return GNUNET_OK;
- }
- }
- GNUNET_break_op (0);
- GNUNET_free (bsign_pub);
- return GNUNET_SYSERR;
-}
-
-
-struct GNUNET_JSON_Specification
-TALER_JSON_spec_denom_pub_cipher (const char *field,
- enum GNUNET_CRYPTO_BlindSignatureAlgorithm
- cipher,
- struct TALER_DenominationPublicKey *pk)
-{
- struct GNUNET_JSON_Specification ret = {
- .parser = &parse_denom_pub_cipher,
- .cleaner = &clean_denom_pub,
- .field = field,
- .cls = (void *) cipher,
- .ptr = pk
- };
-
- return ret;
-}
-
-
-/**
- * Parse given JSON object to denomination signature.
- *
- * @param cls closure, NULL
- * @param root the json object representing data
- * @param[out] spec where to write the data
- * @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
- */
-static enum GNUNET_GenericReturnValue
-parse_denom_sig (void *cls,
- json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_DenominationSignature *denom_sig = spec->ptr;
- struct GNUNET_CRYPTO_UnblindedSignature *unblinded_sig;
- const char *cipher;
- struct GNUNET_JSON_Specification dspec[] = {
- GNUNET_JSON_spec_string ("cipher",
- &cipher),
- GNUNET_JSON_spec_end ()
- };
- const char *emsg;
- unsigned int eline;
-
- (void) cls;
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- dspec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- unblinded_sig = GNUNET_new (struct GNUNET_CRYPTO_UnblindedSignature);
- unblinded_sig->cipher = string_to_cipher (cipher);
- unblinded_sig->rc = 1;
- switch (unblinded_sig->cipher)
- {
- case GNUNET_CRYPTO_BSA_INVALID:
- break;
- case GNUNET_CRYPTO_BSA_RSA:
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_rsa_signature (
- "rsa_signature",
- &unblinded_sig->details.rsa_signature),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (unblinded_sig);
- return GNUNET_SYSERR;
- }
- denom_sig->unblinded_sig = unblinded_sig;
- return GNUNET_OK;
- }
- case GNUNET_CRYPTO_BSA_CS:
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_fixed_auto ("cs_signature_r",
- &unblinded_sig->details.cs_signature.
- r_point),
- GNUNET_JSON_spec_fixed_auto ("cs_signature_s",
- &unblinded_sig->details.cs_signature.
- s_scalar),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (unblinded_sig);
- return GNUNET_SYSERR;
- }
- denom_sig->unblinded_sig = unblinded_sig;
- return GNUNET_OK;
- }
- }
- GNUNET_break_op (0);
- GNUNET_free (unblinded_sig);
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Cleanup data left from parsing denomination public key.
- *
- * @param cls closure, NULL
- * @param[out] spec where to free the data
- */
-static void
-clean_denom_sig (void *cls,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_DenominationSignature *denom_sig = spec->ptr;
-
- (void) cls;
- TALER_denom_sig_free (denom_sig);
-}
-
-
-struct GNUNET_JSON_Specification
-TALER_JSON_spec_denom_sig (const char *field,
- struct TALER_DenominationSignature *sig)
-{
- struct GNUNET_JSON_Specification ret = {
- .parser = &parse_denom_sig,
- .cleaner = &clean_denom_sig,
- .field = field,
- .ptr = sig
- };
-
- sig->unblinded_sig = NULL;
- return ret;
-}
-
-
-/**
- * Parse given JSON object to blinded denomination signature.
- *
- * @param cls closure, NULL
- * @param root the json object representing data
- * @param[out] spec where to write the data
- * @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
- */
-static enum GNUNET_GenericReturnValue
-parse_blinded_denom_sig (void *cls,
- json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_BlindedDenominationSignature *denom_sig = spec->ptr;
- struct GNUNET_CRYPTO_BlindedSignature *blinded_sig;
- const char *cipher;
- struct GNUNET_JSON_Specification dspec[] = {
- GNUNET_JSON_spec_string ("cipher",
- &cipher),
- GNUNET_JSON_spec_end ()
- };
- const char *emsg;
- unsigned int eline;
-
- (void) cls;
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- dspec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- blinded_sig = GNUNET_new (struct GNUNET_CRYPTO_BlindedSignature);
- blinded_sig->cipher = string_to_cipher (cipher);
- blinded_sig->rc = 1;
- switch (blinded_sig->cipher)
- {
- case GNUNET_CRYPTO_BSA_INVALID:
- break;
- case GNUNET_CRYPTO_BSA_RSA:
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_rsa_signature (
- "blinded_rsa_signature",
- &blinded_sig->details.blinded_rsa_signature),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (blinded_sig);
- return GNUNET_SYSERR;
- }
- denom_sig->blinded_sig = blinded_sig;
- return GNUNET_OK;
- }
- case GNUNET_CRYPTO_BSA_CS:
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_uint32 ("b",
- &blinded_sig->details.blinded_cs_answer.b),
- GNUNET_JSON_spec_fixed_auto ("s",
- &blinded_sig->details.blinded_cs_answer.
- s_scalar),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (blinded_sig);
- return GNUNET_SYSERR;
- }
- denom_sig->blinded_sig = blinded_sig;
- return GNUNET_OK;
- }
- }
- GNUNET_break_op (0);
- GNUNET_free (blinded_sig);
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Cleanup data left from parsing denomination public key.
- *
- * @param cls closure, NULL
- * @param[out] spec where to free the data
- */
-static void
-clean_blinded_denom_sig (void *cls,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_BlindedDenominationSignature *denom_sig = spec->ptr;
-
- (void) cls;
- TALER_blinded_denom_sig_free (denom_sig);
-}
-
-
-struct GNUNET_JSON_Specification
-TALER_JSON_spec_blinded_denom_sig (
- const char *field,
- struct TALER_BlindedDenominationSignature *sig)
-{
- struct GNUNET_JSON_Specification ret = {
- .parser = &parse_blinded_denom_sig,
- .cleaner = &clean_blinded_denom_sig,
- .field = field,
- .ptr = sig
- };
-
- sig->blinded_sig = NULL;
- return ret;
-}
-
-
-/**
- * Parse given JSON object to blinded planchet.
- *
- * @param cls closure, NULL
- * @param root the json object representing data
- * @param[out] spec where to write the data
- * @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
- */
-static enum GNUNET_GenericReturnValue
-parse_blinded_planchet (void *cls,
- json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_BlindedPlanchet *blinded_planchet = spec->ptr;
- struct GNUNET_CRYPTO_BlindedMessage *blinded_message;
- const char *cipher;
- struct GNUNET_JSON_Specification dspec[] = {
- GNUNET_JSON_spec_string ("cipher",
- &cipher),
- GNUNET_JSON_spec_end ()
- };
- const char *emsg;
- unsigned int eline;
-
- (void) cls;
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- dspec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- blinded_message = GNUNET_new (struct GNUNET_CRYPTO_BlindedMessage);
- blinded_message->rc = 1;
- blinded_message->cipher = string_to_cipher (cipher);
- switch (blinded_message->cipher)
- {
- case GNUNET_CRYPTO_BSA_INVALID:
- break;
- case GNUNET_CRYPTO_BSA_RSA:
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_varsize (
- "rsa_blinded_planchet",
- &blinded_message->details.rsa_blinded_message.blinded_msg,
- &blinded_message->details.rsa_blinded_message.blinded_msg_size),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (blinded_message);
- return GNUNET_SYSERR;
- }
- blinded_planchet->blinded_message = blinded_message;
- return GNUNET_OK;
- }
- case GNUNET_CRYPTO_BSA_CS:
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_fixed_auto (
- "cs_nonce",
- &blinded_message->details.cs_blinded_message.nonce),
- GNUNET_JSON_spec_fixed_auto (
- "cs_blinded_c0",
- &blinded_message->details.cs_blinded_message.c[0]),
- GNUNET_JSON_spec_fixed_auto (
- "cs_blinded_c1",
- &blinded_message->details.cs_blinded_message.c[1]),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (blinded_message);
- return GNUNET_SYSERR;
- }
- blinded_planchet->blinded_message = blinded_message;
- return GNUNET_OK;
- }
- }
- GNUNET_break_op (0);
- GNUNET_free (blinded_message);
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Cleanup data left from parsing blinded planchet.
- *
- * @param cls closure, NULL
- * @param[out] spec where to free the data
- */
-static void
-clean_blinded_planchet (void *cls,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_BlindedPlanchet *blinded_planchet = spec->ptr;
-
- (void) cls;
- TALER_blinded_planchet_free (blinded_planchet);
-}
-
-
-struct GNUNET_JSON_Specification
-TALER_JSON_spec_blinded_planchet (const char *field,
- struct TALER_BlindedPlanchet *blinded_planchet)
-{
- struct GNUNET_JSON_Specification ret = {
- .parser = &parse_blinded_planchet,
- .cleaner = &clean_blinded_planchet,
- .field = field,
- .ptr = blinded_planchet
- };
-
- blinded_planchet->blinded_message = NULL;
- return ret;
-}
-
-
-/**
- * Parse given JSON object to exchange withdraw values (/csr).
- *
- * @param cls closure, NULL
- * @param root the json object representing data
- * @param[out] spec where to write the data
- * @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
- */
-static enum GNUNET_GenericReturnValue
-parse_exchange_withdraw_values (void *cls,
- json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_ExchangeWithdrawValues *ewv = spec->ptr;
- struct GNUNET_CRYPTO_BlindingInputValues *bi;
- const char *cipher;
- struct GNUNET_JSON_Specification dspec[] = {
- GNUNET_JSON_spec_string ("cipher",
- &cipher),
- GNUNET_JSON_spec_end ()
- };
- const char *emsg;
- unsigned int eline;
- enum GNUNET_CRYPTO_BlindSignatureAlgorithm ci;
-
- (void) cls;
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- dspec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- ci = string_to_cipher (cipher);
- switch (ci)
- {
- case GNUNET_CRYPTO_BSA_INVALID:
- break;
- case GNUNET_CRYPTO_BSA_RSA:
- ewv->blinding_inputs = TALER_denom_ewv_rsa_singleton ()->blinding_inputs;
- return GNUNET_OK;
- case GNUNET_CRYPTO_BSA_CS:
- bi = GNUNET_new (struct GNUNET_CRYPTO_BlindingInputValues);
- bi->cipher = GNUNET_CRYPTO_BSA_CS;
- bi->rc = 1;
- {
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_fixed (
- "r_pub_0",
- &bi->details.cs_values.r_pub[0],
- sizeof (struct GNUNET_CRYPTO_CsRPublic)),
- GNUNET_JSON_spec_fixed (
- "r_pub_1",
- &bi->details.cs_values.r_pub[1],
- sizeof (struct GNUNET_CRYPTO_CsRPublic)),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (root,
- ispec,
- &emsg,
- &eline))
- {
- GNUNET_break_op (0);
- GNUNET_free (bi);
- return GNUNET_SYSERR;
- }
- ewv->blinding_inputs = bi;
- return GNUNET_OK;
- }
- }
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Cleanup data left from parsing withdraw values
- *
- * @param cls closure, NULL
- * @param[out] spec where to free the data
- */
-static void
-clean_exchange_withdraw_values (
- void *cls,
- struct GNUNET_JSON_Specification *spec)
-{
- struct TALER_ExchangeWithdrawValues *ewv = spec->ptr;
-
- (void) cls;
- TALER_denom_ewv_free (ewv);
-}
-
-
-struct GNUNET_JSON_Specification
-TALER_JSON_spec_exchange_withdraw_values (
- const char *field,
- struct TALER_ExchangeWithdrawValues *ewv)
-{
- struct GNUNET_JSON_Specification ret = {
- .parser = &parse_exchange_withdraw_values,
- .cleaner = &clean_exchange_withdraw_values,
- .field = field,
- .ptr = ewv
- };
-
- ewv->blinding_inputs = NULL;
- return ret;
-}
-
-
-/**
* Closure for #parse_i18n_string.
*/
struct I18nContext
@@ -1501,56 +595,6 @@ TALER_JSON_spec_web_url (const char *field,
/**
- * Parse given JSON object to payto:// URI.
- *
- * @param cls closure, NULL
- * @param root the json object representing data
- * @param[out] spec where to write the data
- * @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
- */
-static enum GNUNET_GenericReturnValue
-parse_payto_uri (void *cls,
- json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- const char *str;
- char *err;
-
- (void) cls;
- str = json_string_value (root);
- if (NULL == str)
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- err = TALER_payto_validate (str);
- if (NULL != err)
- {
- GNUNET_break_op (0);
- GNUNET_free (err);
- return GNUNET_SYSERR;
- }
- *(const char **) spec->ptr = str;
- return GNUNET_OK;
-}
-
-
-struct GNUNET_JSON_Specification
-TALER_JSON_spec_payto_uri (const char *field,
- const char **payto_uri)
-{
- struct GNUNET_JSON_Specification ret = {
- .parser = &parse_payto_uri,
- .field = field,
- .ptr = payto_uri
- };
-
- *payto_uri = NULL;
- return ret;
-}
-
-
-/**
* Parse given JSON object with protocol version.
*
* @param cls closure, NULL