donau

Donation authority for GNU Taler (experimental)
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/donau/donau-httpd_keys.c | 63++++++++++++++++++++++++++++++++++++++++-----------------------
Msrc/donaudb/0002-donation_units.sql | 8++++----
Msrc/donaudb/pg_insert_donation_unit.c | 7+++----
Msrc/donaudb/pg_insert_donation_unit.h | 4++--
Msrc/include/donaudb_plugin.h | 4++--
Msrc/json/json_helper.c | 956-------------------------------------------------------------------------------
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