donau

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

commit a49663396b12c82342891edc3012550df40a2d84
parent abf771e857b36b56c14cd8cd8047f283153b2347
Author: Matyja Lukas Adam <lukas.matyja@students.bfh.ch>
Date:   Tue,  2 Jan 2024 12:25:05 +0100

[donau] some deletions

Diffstat:
Msrc/donau-tools/donau-dbinit.c | 165++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/donau/donau-httpd.c | 32++++++++++++++++----------------
Msrc/donau/donau-httpd_keys.c | 247+++++++++++++-------------------------------------------------------------------
3 files changed, 137 insertions(+), 307 deletions(-)

diff --git a/src/donau-tools/donau-dbinit.c b/src/donau-tools/donau-dbinit.c @@ -22,6 +22,7 @@ #include "taler/platform.h" #include <gnunet/gnunet_util_lib.h> #include "donaudb_lib.h" +#include "donau_util.h" /** @@ -62,80 +63,80 @@ static int force_create_partitions; * @param cfgfile name of the configuration file used (for saving, can be NULL!) * @param cfg configuration */ -// static void -// run (void *cls, -// char *const *args, -// const char *cfgfile, -// const struct GNUNET_CONFIGURATION_Handle *cfg) -// { -// struct DONAUDB_Plugin *plugin; - -// (void) cls; -// (void) args; -// (void) cfgfile; - -// if (NULL == -// (plugin = DONAUDB_plugin_load (cfg))) -// { -// fprintf (stderr, -// "Failed to initialize database plugin.\n"); -// global_ret = EXIT_NOTINSTALLED; -// return; -// } -// if (reset_db) -// { -// if (GNUNET_OK != -// plugin->drop_tables (plugin->cls)) -// { -// GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -// "Could not drop tables as requested. Either database was not yet initialized, or permission denied. Consult the logs. Will still try to create new tables.\n"); -// } -// } -// if (GNUNET_OK != -// plugin->create_tables (plugin->cls, -// force_create_partitions || num_partitions > 0, -// num_partitions)) -// { -// fprintf (stderr, -// "Failed to initialize database.\n"); -// DONAUDB_plugin_unload (plugin); -// plugin = NULL; -// global_ret = EXIT_NOPERMISSION; -// return; -// } -// if (gc_db || clear_shards) -// { -// if (GNUNET_OK != -// plugin->preflight (plugin->cls)) -// { -// fprintf (stderr, -// "Failed to prepare database.\n"); -// DONAUDB_plugin_unload (plugin); -// plugin = NULL; -// global_ret = EXIT_NOPERMISSION; -// return; -// } -// if (clear_shards) -// { -// if (GNUNET_OK != -// plugin->delete_shard_locks (plugin->cls)) -// { -// fprintf (stderr, -// "Clearing revolving shards failed!\n"); -// } -// } -// if (gc_db) -// { -// if (GNUNET_SYSERR == plugin->gc (plugin->cls)) -// { -// fprintf (stderr, -// "Garbage collection failed!\n"); -// } -// } -// } -// DONAUDB_plugin_unload (plugin); -// plugin = NULL; -// } +static void +run (void *cls, + char *const *args, + const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + struct DONAUDB_Plugin *plugin; + + (void) cls; + (void) args; + (void) cfgfile; + + if (NULL == + (plugin = DONAUDB_plugin_load (cfg))) + { + fprintf (stderr, + "Failed to initialize database plugin.\n"); + global_ret = EXIT_NOTINSTALLED; + return; + } + if (reset_db) + { + if (GNUNET_OK != + plugin->drop_tables (plugin->cls)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Could not drop tables as requested. Either database was not yet initialized, or permission denied. Consult the logs. Will still try to create new tables.\n"); + } + } + if (GNUNET_OK != + plugin->create_tables (plugin->cls, + force_create_partitions || num_partitions > 0, + num_partitions)) + { + fprintf (stderr, + "Failed to initialize database.\n"); + DONAUDB_plugin_unload (plugin); + plugin = NULL; + global_ret = EXIT_NOPERMISSION; + return; + } + if (gc_db || clear_shards) + { + if (GNUNET_OK != + plugin->preflight (plugin->cls)) + { + fprintf (stderr, + "Failed to prepare database.\n"); + DONAUDB_plugin_unload (plugin); + plugin = NULL; + global_ret = EXIT_NOPERMISSION; + return; + } + if (clear_shards) + { + if (GNUNET_OK != + plugin->delete_shard_locks (plugin->cls)) + { + fprintf (stderr, + "Clearing revolving shards failed!\n"); + } + } + if (gc_db) + { + if (GNUNET_SYSERR == plugin->gc (plugin->cls)) + { + fprintf (stderr, + "Garbage collection failed!\n"); + } + } + } + DONAUDB_plugin_unload (plugin); + plugin = NULL; +} /** @@ -182,14 +183,14 @@ main (int argc, return EXIT_INVALIDARGUMENT; /* force linker to link against libtalerutil; if we do not do this, the linker may "optimize" libtalerutil - away and skip #TALER_OS_init(), which we do need */ - // TALER_OS_init (); - // ret = GNUNET_PROGRAM_run ( - // argc, argv, - // "taler-donau-dbinit", - // gettext_noop ("Initialize Taler donau database"), - // options, - // &run, NULL); + away and skip #DONAU_OS_init(), which we do need */ + DONAU_OS_init (); + ret = GNUNET_PROGRAM_run ( + argc, argv, + "donau-dbinit", + gettext_noop ("Initialize Donau database"), + options, + &run, NULL); GNUNET_free_nz ((void *) argv); if (GNUNET_SYSERR == ret) return EXIT_INVALIDARGUMENT; diff --git a/src/donau/donau-httpd.c b/src/donau/donau-httpd.c @@ -1009,22 +1009,22 @@ donau_serve_process_config (void) // GNUNET_free (attr_enc_key_str); // } - for (unsigned int i = 0; i<MAX_DB_RETRIES; i++) - { - DH_plugin = DONAUDB_plugin_load (DH_cfg); - if (NULL != DH_plugin) - break; - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Failed to connect to DB, will try again %u times\n", - MAX_DB_RETRIES - i); - sleep (1); - } - if (NULL == DH_plugin) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to initialize DB subsystem. Giving up.\n"); - return GNUNET_SYSERR; - } + // for (unsigned int i = 0; i<MAX_DB_RETRIES; i++) + // { + // DH_plugin = DONAUDB_plugin_load (DH_cfg); + // if (NULL != DH_plugin) + // break; + // GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + // "Failed to connect to DB, will try again %u times\n", + // MAX_DB_RETRIES - i); + // sleep (1); + // } + // if (NULL == DH_plugin) + // { + // GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + // "Failed to initialize DB subsystem. Giving up.\n"); + // return GNUNET_SYSERR; + // } return GNUNET_OK; } diff --git a/src/donau/donau-httpd_keys.c b/src/donau/donau-httpd_keys.c @@ -45,7 +45,7 @@ /** * Information about a denomination on offer by the denomination helper. */ -struct HelperDenomination +struct HelperDonationUnit { // maybe change to year unsigned int later -> many associated changes @@ -70,7 +70,7 @@ struct HelperDenomination /** * Signature over this key from the security module's key. */ - struct TALER_SecurityModuleSignatureP sm_sig; // when to use the module key and when the master key? + struct TALER_SecurityModuleSignatureP sm_sig; /** * The (full) public key. @@ -157,17 +157,17 @@ struct HelperState struct TALER_CRYPTO_CsDenominationHelper *csdh; /** - * Map from H(denom_pub) to `struct HelperDenomination` entries. + * Map from H(denom_pub) to `struct HelperDonationUnit` entries. */ struct GNUNET_CONTAINER_MultiHashMap *denom_keys; /** - * Map from H(rsa_pub) to `struct HelperDenomination` entries. + * Map from H(rsa_pub) to `struct HelperDonationUnit` entries. */ struct GNUNET_CONTAINER_MultiHashMap *rsa_keys; /** - * Map from H(cs_pub) to `struct HelperDenomination` entries. + * Map from H(cs_pub) to `struct HelperDonationUnit` entries. */ struct GNUNET_CONTAINER_MultiHashMap *cs_keys; @@ -176,7 +176,7 @@ struct HelperState * entries. Based on the fact that a `struct GNUNET_PeerIdentity` is also * an EdDSA public key. */ - struct GNUNET_CONTAINER_MultiPeerMap *esign_keys; //abuse fall hash für public keys, key integer, key hash, key public key + struct GNUNET_CONTAINER_MultiPeerMap *esign_keys; }; @@ -492,7 +492,7 @@ suspend_request (struct MHD_Connection *connection) * * @param cls NULL * @param hc denomination hash (unused) - * @param value a `struct DH_DenominationKey` + * @param value a `struct DH_DonationUnitKey` * @return #GNUNET_OK */ static enum GNUNET_GenericReturnValue @@ -500,7 +500,7 @@ check_dk (void *cls, const struct GNUNET_HashCode *hc, void *value) { - struct DH_DenominationKey *dk = value; + struct DH_DonationUnitKey *dk = value; (void) cls; (void) hc; @@ -647,9 +647,9 @@ check_esign_sm_pub (const struct TALER_SecurityModulePublicKeyP *sm_pub) * Helper function for #destroy_key_helpers to free all entries * in the `denom_keys` map. * - * @param cls the `struct HelperDenomination` + * @param cls the `struct HelperDonationUnit` * @param h_denom_pub hash of the denomination public key - * @param value the `struct HelperDenomination` to release + * @param value the `struct HelperDonationUnit` to release * @return #GNUNET_OK (continue to iterate) */ static enum GNUNET_GenericReturnValue @@ -657,7 +657,7 @@ free_denom_cb (void *cls, const struct GNUNET_HashCode *h_denom_pub, void *value) { - struct HelperDenomination *hd = value; + struct HelperDonationUnit *hd = value; (void) cls; (void) h_denom_pub; @@ -807,7 +807,7 @@ helper_rsa_cb ( const struct TALER_SecurityModuleSignatureP *sm_sig) { struct HelperState *hs = cls; - struct HelperDenomination *hd; + struct HelperDonationUnit *hd; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "RSA helper announces key %s for denomination type %s with validity %s\n", @@ -827,7 +827,7 @@ helper_rsa_cb ( } GNUNET_assert (NULL != sm_pub); check_denom_rsa_sm_pub (sm_pub); - hd = GNUNET_new (struct HelperDenomination); + hd = GNUNET_new (struct HelperDonationUnit); hd->start_time = start_time; hd->validity_duration = validity_duration; hd->h_details.h_rsa = *h_rsa; @@ -888,7 +888,7 @@ helper_cs_cb ( const struct TALER_SecurityModuleSignatureP *sm_sig) { struct HelperState *hs = cls; - struct HelperDenomination *hd; + struct HelperDonationUnit *hd; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "CS helper announces key %s for denomination type %s with validity %s\n", @@ -908,7 +908,7 @@ helper_cs_cb ( } GNUNET_assert (NULL != sm_pub); check_denom_cs_sm_pub (sm_pub); - hd = GNUNET_new (struct HelperDenomination); + hd = GNUNET_new (struct HelperDonationUnit); hd->start_time = start_time; hd->validity_duration = validity_duration; hd->h_details.h_cs = *h_cs; @@ -1067,15 +1067,15 @@ sync_key_helpers (struct HelperState *hs) * * @param cls a `struct DH_KeyStateHandle`, unused * @param h_denom_pub hash of the denomination public key, unused - * @param value a `struct DH_DenominationKey` to free + * @param value a `struct DH_DonationUnitKey` to free * @return #GNUNET_OK (continue to iterate) */ static enum GNUNET_GenericReturnValue -clear_denomination_cb (void *cls, +clear_donation_unit_cb (void *cls, const struct GNUNET_HashCode *h_denom_pub, void *value) { - struct DH_DenominationKey *dk = value; + struct DH_DonationUnitKey *dk = value; struct DH_AuditorSignature *as; (void) cls; @@ -1249,37 +1249,16 @@ DH_keys_finished () * @param denom_pub public key of the denomination * @param h_denom_pub hash of @a denom_pub * @param meta meta data information about the denomination type (value, year) - * @param master_sig master signature affirming the validity of this denomination - * @param recoup_possible true if the key was revoked and clients can currently recoup - * coins of this denomination */ static void denomination_info_cb ( void *cls, const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_DenominationHashP *h_denom_pub, - const struct DONAUDB_DenominationKeyMetaData *meta, - const struct TALER_MasterSignatureP *master_sig, - bool recoup_possible) + const struct DONAUDB_DonationUnitKeyMetaData *meta) { struct DH_KeyStateHandle *ksh = cls; - struct DH_DenominationKey *dk; - - if (GNUNET_OK != - TALER_donau_offline_denom_validity_verify ( - h_denom_pub, - meta->start, - meta->expire_withdraw, - meta->expire_deposit, - meta->expire_legal, - &meta->value, - &DH_master_public_key, - master_sig)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Database has denomination with invalid signature. Skipping entry. Did the donau offline public key change?\n"); - return; - } + struct DH_DonationUnitKey *dk; GNUNET_assert (TALER_DENOMINATION_INVALID != denom_pub->cipher); if (GNUNET_TIME_absolute_is_zero (meta->start.abs_time) || @@ -1292,13 +1271,11 @@ denomination_info_cb ( GNUNET_h2s (&h_denom_pub->hash)); return; } - dk = GNUNET_new (struct DH_DenominationKey); + dk = GNUNET_new (struct DH_DonationUnitKey); TALER_denom_pub_deep_copy (&dk->denom_pub, denom_pub); dk->h_denom_pub = *h_denom_pub; dk->meta = *meta; - dk->master_sig = *master_sig; - dk->recoup_possible = recoup_possible; dk->denom_pub.age_mask = meta->age_mask; GNUNET_assert ( @@ -1322,30 +1299,15 @@ static void signkey_info_cb ( void *cls, const struct DONAU_DonauPublicKeyP *donau_pub, - const struct DONAUDB_SignkeyMetaData *meta, - const struct TALER_MasterSignatureP *master_sig) + const struct DONAUDB_SignkeyMetaData *meta) { struct DH_KeyStateHandle *ksh = cls; struct SigningKey *sk; struct GNUNET_PeerIdentity pid; - if (GNUNET_OK != - TALER_donau_offline_signkey_validity_verify ( - donau_pub, - meta->start, - meta->expire_sign, - meta->expire_legal, - &DH_master_public_key, - master_sig)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Database has signing key with invalid signature. Skipping entry. Did the donau offline public key change?\n"); - return; - } sk = GNUNET_new (struct SigningKey); sk->donau_pub = *donau_pub; sk->meta = *meta; - sk->master_sig = *master_sig; pid.public_key = donau_pub->eddsa_pub; GNUNET_assert ( GNUNET_OK == @@ -1357,139 +1319,6 @@ signkey_info_cb ( /** - * Closure for #get_auditor_sigs. - */ -struct GetAuditorSigsContext -{ - /** - * Where to store the matching signatures. - */ - json_t *denom_keys; - - /** - * Public key of the auditor to match against. - */ - const struct TALER_AuditorPublicKeyP *auditor_pub; -}; - - -/** - * Extract the auditor signatures matching the auditor's public - * key from the @a value and generate the respective JSON. - * - * @param cls a `struct GetAuditorSigsContext` - * @param h_denom_pub hash of the denomination public key - * @param value a `struct DH_DenominationKey` - * @return #GNUNET_OK (continue to iterate) - */ -static enum GNUNET_GenericReturnValue -get_auditor_sigs (void *cls, - const struct GNUNET_HashCode *h_denom_pub, - void *value) -{ - struct GetAuditorSigsContext *ctx = cls; - struct DH_DenominationKey *dk = value; - - for (struct DH_AuditorSignature *as = dk->as_head; - NULL != as; - as = as->next) - { - if (0 != - GNUNET_memcmp (ctx->auditor_pub, - &as->apub)) - continue; - GNUNET_break (0 == - json_array_append_new ( - ctx->denom_keys, - GNUNET_JSON_PACK ( - GNUNET_JSON_pack_data_auto ("denom_pub_h", - h_denom_pub), - GNUNET_JSON_pack_data_auto ("auditor_sig", - &as->asig)))); - } - return GNUNET_OK; -} - - -/** - * Function called with information about the donau's auditors. - * - * @param cls closure with a `struct DH_KeyStateHandle *` - * @param auditor_pub the public key of the auditor - * @param auditor_url URL of the REST API of the auditor - * @param auditor_name human readable official name of the auditor - */ -static void -auditor_info_cb ( - void *cls, - const struct TALER_AuditorPublicKeyP *auditor_pub, - const char *auditor_url, - const char *auditor_name) -{ - struct DH_KeyStateHandle *ksh = cls; - struct GetAuditorSigsContext ctx; - - ctx.denom_keys = json_array (); - GNUNET_assert (NULL != ctx.denom_keys); - ctx.auditor_pub = auditor_pub; - GNUNET_CONTAINER_multihashmap_iterate (ksh->denomkey_map, - &get_auditor_sigs, - &ctx); - GNUNET_break (0 == - json_array_append_new ( - ksh->auditors, - GNUNET_JSON_PACK ( - GNUNET_JSON_pack_string ("auditor_name", - auditor_name), - GNUNET_JSON_pack_data_auto ("auditor_pub", - auditor_pub), - GNUNET_JSON_pack_string ("auditor_url", - auditor_url), - GNUNET_JSON_pack_array_steal ("denomination_keys", - ctx.denom_keys)))); -} - - -/** - * Function called with information about the denominations - * audited by the donau's auditors. - * - * @param cls closure with a `struct DH_KeyStateHandle *` - * @param auditor_pub the public key of an auditor - * @param h_denom_pub hash of a denomination key audited by this auditor - * @param auditor_sig signature from the auditor affirming this - */ -static void -auditor_denom_cb ( - void *cls, - const struct TALER_AuditorPublicKeyP *auditor_pub, - const struct TALER_DenominationHashP *h_denom_pub, - const struct TALER_AuditorSignatureP *auditor_sig) -{ - struct DH_KeyStateHandle *ksh = cls; - struct DH_DenominationKey *dk; - struct DH_AuditorSignature *as; - - dk = GNUNET_CONTAINER_multihashmap_get (ksh->denomkey_map, - &h_denom_pub->hash); - if (NULL == dk) - { - /* Odd, this should be impossible as per foreign key - constraint on 'auditor_denom_sigs'! Well, we can - safely continue anyway, so let's just log it. */ - GNUNET_break (0); - return; - } - as = GNUNET_new (struct DH_AuditorSignature); - as->asig = *auditor_sig; - as->apub = *auditor_pub; - GNUNET_CONTAINER_DLL_insert (dk->as_head, - dk->as_tail, - as); -} - - -/** * Closure for #add_sign_key_cb. */ struct SignKeyCtx @@ -1581,7 +1410,7 @@ struct DenomKeyCtx * * @param cls a `struct DenomKeyCtx` * @param h_denom_pub hash of the denomination key - * @param value a `struct DH_DenominationKey` + * @param value a `struct DH_DonationUnitKey` * @return #GNUNET_OK (continue to iterate) */ static enum GNUNET_GenericReturnValue @@ -1590,7 +1419,7 @@ add_denom_key_cb (void *cls, void *value) { struct DenomKeyCtx *dkc = cls; - struct DH_DenominationKey *dk = value; + struct DH_DonationUnitKey *dk = value; if (dk->recoup_possible) { @@ -2010,7 +1839,7 @@ finish_keys_response (struct DH_KeyStateHandle *ksh) // "denom_pubs" array along with the new grouped "denominations". // "denom_pubs" Will be removed sooner or later. { - struct DH_DenominationKey *dk; + struct DH_DonationUnitKey *dk; struct GNUNET_CONTAINER_MultiHashMap *denominations_by_group; /* GroupData is the value we store for each group meta-data */ struct GroupData @@ -2153,7 +1982,7 @@ finish_keys_response (struct DH_KeyStateHandle *ksh) /* Now that we have found/created the right group, add the denomination to the list */ { - struct HelperDenomination *hd; + struct HelperDonationUnit *hd; struct GNUNET_JSON_PackSpec key_spec; bool private_key_lost; @@ -2515,7 +2344,7 @@ DH_keys_get_state (void) } -struct DH_DenominationKey * +struct DH_DonationUnitKey * DH_keys_denomination_by_hash ( const struct TALER_DenominationHashP *h_denom_pub, struct MHD_Connection *conn, @@ -2540,14 +2369,14 @@ DH_keys_denomination_by_hash ( } -struct DH_DenominationKey * +struct DH_DonationUnitKey * DH_keys_denomination_by_hash_from_state ( const struct DH_KeyStateHandle *ksh, const struct TALER_DenominationHashP *h_denom_pub, struct MHD_Connection *conn, MHD_RESULT *mret) { - struct DH_DenominationKey *dk; + struct DH_DonationUnitKey *dk; dk = GNUNET_CONTAINER_multihashmap_get (ksh->denomkey_map, &h_denom_pub->hash); @@ -2570,7 +2399,7 @@ DH_keys_denomination_sign ( struct TALER_BlindedDenominationSignature *bs) { struct DH_KeyStateHandle *ksh; - struct HelperDenomination *hd; + struct HelperDonationUnit *hd; const struct TALER_DenominationHashP *h_denom_pub = csd->h_denom_pub; const struct TALER_BlindedPlanchet *bp = csd->bp; @@ -2626,7 +2455,7 @@ DH_keys_donation_unit_batch_sign ( struct TALER_BlindedDenominationSignature *bss) { struct DH_KeyStateHandle *ksh; - struct HelperDenomination *hd; + struct HelperDonationUnit *hd; struct TALER_CRYPTO_RsaSignRequest rsrs[csds_length]; struct TALER_CRYPTO_CsSignRequest csrs[csds_length]; struct TALER_BlindedDenominationSignature rs[csds_length]; @@ -2749,7 +2578,7 @@ DH_keys_denomination_cs_r_pub ( const struct TALER_DenominationHashP *h_denom_pub = cdd->h_denom_pub; const struct TALER_CsNonce *nonce = cdd->nonce; struct DH_KeyStateHandle *ksh; - struct HelperDenomination *hd; + struct HelperDonationUnit *hd; ksh = DH_keys_get_state (); if (NULL == ksh) @@ -2788,7 +2617,7 @@ DH_keys_denomination_cs_batch_r_pub ( struct TALER_DenominationCSPublicRPairP *r_pubs) { struct DH_KeyStateHandle *ksh; - struct HelperDenomination *hd; + struct HelperDonationUnit *hd; struct TALER_CRYPTO_CsDeriveRequest cdrs[cdds_length]; ksh = DH_keys_get_state (); @@ -2827,7 +2656,7 @@ void DH_keys_denomination_revoke (const struct TALER_DenominationHashP *h_denom_pub) { struct DH_KeyStateHandle *ksh; - struct HelperDenomination *hd; + struct HelperDonationUnit *hd; ksh = DH_keys_get_state (); if (NULL == ksh) @@ -3133,7 +2962,7 @@ struct FutureBuilderContext * * @param cls the `struct FutureBuilderContext *` * @param h_denom_pub hash of the denomination public key - * @param value a `struct HelperDenomination` + * @param value a `struct HelperDonationUnit` * @return #GNUNET_OK (continue to iterate) */ static enum GNUNET_GenericReturnValue @@ -3142,8 +2971,8 @@ add_future_denomkey_cb (void *cls, void *value) { struct FutureBuilderContext *fbc = cls; - struct HelperDenomination *hd = value; - struct DH_DenominationKey *dk; + struct HelperDonationUnit *hd = value; + struct DH_DonationUnitKey *dk; struct DONAUDB_DenominationKeyMetaData meta = {0}; dk = GNUNET_CONTAINER_multihashmap_get (fbc->ksh->denomkey_map, @@ -3189,7 +3018,7 @@ add_future_denomkey_cb (void *cls, * * @param cls the `struct FutureBuilderContext *` * @param pid actually the donau public key (type disguised) - * @param value a `struct HelperDenomination` + * @param value a `struct HelperDonationUnit` * @return #GNUNET_OK (continue to iterate) */ static enum GNUNET_GenericReturnValue