donau

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

commit 741441eed9c4ef63ab9e5f6f121c127d491c3319
parent b2688530270fd4ad906d4760724b30071e38cad4
Author: Matyja Lukas Adam <lukas.matyja@students.bfh.ch>
Date:   Wed, 15 May 2024 00:04:47 +0200

[testing] small changes

Diffstat:
Msrc/donau/donau-httpd_csr.c | 2+-
Msrc/include/donau_crypto_lib.h | 13+++++++++++++
Msrc/include/donau_testing_lib.h | 6+++---
Msrc/lib/donau_api_csr_post.c | 78+++++++++++++++++++++++++++++++++++++++++-------------------------------------
Msrc/testing/test_donau_api.c | 2+-
Msrc/testing/testing_api_cmd_issue_receipts.c | 212+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Msrc/util/donau_crypto.c | 13+++++++++++++
7 files changed, 181 insertions(+), 145 deletions(-)

diff --git a/src/donau/donau-httpd_csr.c b/src/donau/donau-httpd_csr.c @@ -115,7 +115,7 @@ DH_handler_csr_issue (struct DH_RequestContext *rc, return TALER_MHD_REPLY_JSON_PACK ( rc->connection, - MHD_HTTP_OK, + MHD_HTTP_CREATED, TALER_JSON_pack_exchange_withdraw_values ("ewv", &exw)); } diff --git a/src/include/donau_crypto_lib.h b/src/include/donau_crypto_lib.h @@ -654,6 +654,19 @@ DONAU_donation_unit_ewv_rsa_singleton (void); /** + * Make a (deep) copy of the given @a bi_src to + * @a bi_dst. + * + * @param[out] bi_dst target to copy to + * @param bi_src blinding input values to copy + */ +void +DONAU_donation_unit_ewv_copy ( + struct DONAU_BatchIssueValues *bi_dst, + const struct DONAU_BatchIssueValues *bi_src); + + +/** * Blind udi for blind signing with @a du_pub using blinding secret @a budi_secret. * * NOTE: As a particular oddity, the @a budi is only partially diff --git a/src/include/donau_testing_lib.h b/src/include/donau_testing_lib.h @@ -145,9 +145,9 @@ TALER_TESTING_cmd_issue_receipts (const char *label, */ struct TALER_TESTING_Command TALER_TESTING_cmd_submit_receipts (const char *label, - const char *issue_receipt_reference, - const uint64_t year, - unsigned int expected_response_code); + const char *issue_receipt_reference, + const uint64_t year, + unsigned int expected_response_code); /** diff --git a/src/lib/donau_api_csr_post.c b/src/lib/donau_api_csr_post.c @@ -77,8 +77,8 @@ struct DONAU_CsRBatchIssueHandle */ static void handle_csr_issue_post_finished (void *cls, - long response_code, - const void *resp_obj) + long response_code, + const void *resp_obj) { struct DONAU_CsRBatchIssueHandle *csrh = cls; const json_t *j = resp_obj; @@ -92,35 +92,39 @@ handle_csr_issue_post_finished (void *cls, switch (response_code) { case MHD_HTTP_CREATED: - struct GNUNET_JSON_Specification spec[] = { - TALER_JSON_spec_exchange_withdraw_values ( // TODO: method for GNUNET - "ewv", - (struct TALER_ExchangeWithdrawValues *) &csrresp.details.ok.alg_values), - GNUNET_JSON_spec_end () - }; - if (GNUNET_OK != - GNUNET_JSON_parse (j, - spec, - NULL, - NULL)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Could not parse response from csr POST\n"); - GNUNET_break_op (0); - } - csrh->cb (csrh->cb_cls, - &csrresp); + struct GNUNET_JSON_Specification spec[] = { + TALER_JSON_spec_exchange_withdraw_values ( // TODO: method for GNUNET + "ewv", + (struct TALER_ExchangeWithdrawValues *) &csrresp.details.ok.alg_values), + GNUNET_JSON_spec_end () + }; + if (GNUNET_OK != + GNUNET_JSON_parse (j, + spec, + NULL, + NULL)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Could not parse response from csr POST\n"); + GNUNET_break_op (0); + } + csrh->cb (csrh->cb_cls, + &csrresp); break; - // Donation unit was revoked. + // Donation unit was revoked. case MHD_HTTP_GONE: csrresp.hr.ec = TALER_JSON_get_error_code (j); csrresp.hr.hint = TALER_JSON_get_error_hint (j); break; - // Donation unit or endpoint not found. + // Donation unit or endpoint not found. case MHD_HTTP_NOT_FOUND: csrresp.hr.ec = TALER_JSON_get_error_code (j); csrresp.hr.hint = TALER_JSON_get_error_hint (j); break; + case MHD_HTTP_BAD_REQUEST: + csrresp.hr.ec = TALER_JSON_get_error_code (j); + csrresp.hr.hint = TALER_JSON_get_error_hint (j); + break; default: /* unexpected response code */ GNUNET_break_op (0); @@ -136,7 +140,7 @@ handle_csr_issue_post_finished (void *cls, if (NULL != csrh->cb) { csrh->cb (csrh->cb_cls, - &csrresp); + &csrresp); csrh->cb = NULL; } DONAU_csr_cancel (csrh); @@ -168,12 +172,12 @@ DONAU_csr_issue ( csrh->cb_cls = cb_cls; csrh->ctx = ctx; csrh->url = TALER_url_join (url, - "charities", - NULL); + "csr-issue", + NULL); if (NULL == csrh->url) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Could not construct requested URL.\n"); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Could not construct requested URL.\n"); GNUNET_free (csrh); return NULL; } @@ -181,12 +185,12 @@ DONAU_csr_issue ( "Request CS R with URL `%s'.\n", csrh->url); body = GNUNET_JSON_PACK ( - GNUNET_JSON_pack_data_varsize ("nonce", - nonce, - sizeof(*nonce)), - GNUNET_JSON_pack_data_varsize ("donation_unit_pub_hash", - &h_donation_unit_pub, - sizeof(h_donation_unit_pub))); + GNUNET_JSON_pack_data_varsize ("nonce", + nonce, + sizeof(*nonce)), + GNUNET_JSON_pack_data_varsize ("du_pub_hash", + &h_donation_unit_pub, + sizeof(h_donation_unit_pub))); eh = DONAU_curl_easy_get_ (csrh->url); if ( (NULL == eh) || (GNUNET_OK != @@ -203,10 +207,10 @@ DONAU_csr_issue ( } json_decref (body); csrh->job = GNUNET_CURL_job_add2 (ctx, - eh, - csrh->post_ctx.headers, - &handle_csr_issue_post_finished, - csrh); + eh, + csrh->post_ctx.headers, + &handle_csr_issue_post_finished, + csrh); return csrh; } diff --git a/src/testing/test_donau_api.c b/src/testing/test_donau_api.c @@ -90,7 +90,7 @@ run (void *cls, // FIXME TALER_TESTING_cmd_issue_receipts ("issue-receipts", "post-charity", - uses_cs, + uses_cs, 2024, "7560001010000", // tax id "1234", // salt for tax id hash diff --git a/src/testing/testing_api_cmd_issue_receipts.c b/src/testing/testing_api_cmd_issue_receipts.c @@ -121,25 +121,25 @@ struct StatusState struct CSR_Data { - /** - * Handle to the "batch issue receipt status" operation. - */ - struct DONAU_CsRBatchIssueHandle *csr_handle; - - /** - * CS-Nonce - */ - union GNUNET_CRYPTO_BlindSessionNonce nonce; - - /** - * batch issue receipt status state - */ - struct StatusState *ss; - - /** - * array position in batch issue receipt request (first position is zero) - */ - size_t position; + /** + * Handle to the "batch issue receipt status" operation. + */ + struct DONAU_CsRBatchIssueHandle *csr_handle; + + /** + * CS-Nonce + */ + union GNUNET_CRYPTO_BlindSessionNonce nonce; + + /** + * batch issue receipt status state + */ + struct StatusState *ss; + + /** + * array position in batch issue receipt request (first position is zero) + */ + size_t position; }; @@ -201,15 +201,15 @@ phase_two (void *cls) struct StatusState *ss = cls; const struct DONAU_BlindedUniqueDonorIdentifierKeyPair *bkps = ss->bkps; ss->birh = DONAU_charity_issue_receipt ( - TALER_TESTING_interpreter_get_context (ss->is), - TALER_TESTING_get_donau_url (ss->is), - &ss->charity_priv, - ss->charity_id, - ss->year, - ss->num_bkp, - bkps, - &issue_receipts_status_cb, - ss); + TALER_TESTING_interpreter_get_context (ss->is), + TALER_TESTING_get_donau_url (ss->is), + &ss->charity_priv, + ss->charity_id, + ss->year, + ss->num_bkp, + bkps, + &issue_receipts_status_cb, + ss); } @@ -230,7 +230,7 @@ cs_stage_two_callback ( { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Unexpected HTTP response code: %d in %s:%u\n", - csrresp->hr.http_status, + csrresp->hr.http_status, __FILE__, __LINE__); json_dumpf (csrresp->hr.reply, @@ -240,41 +240,47 @@ cs_stage_two_callback ( return; } - struct DONAU_DonationUnitPublicKey *cs_pk = &csr_data->ss->keys->donation_unit_keys[csr_data->position].key; - const struct DONAU_BatchIssueValues *alg_values = csr_data->ss->alg_values[csr_data->position]; + struct DONAU_DonationUnitPublicKey *cs_pk = + &csr_data->ss->keys->donation_unit_keys[csr_data->position].key; + struct DONAU_BatchIssueValues *alg_values = {0}; struct DONAU_BudiMasterSecretP ps; - struct DONAU_BlindedUniqueDonorIdentifier *blinded_udi = &csr_data->ss->bkps[csr_data->position].blinded_udi; + struct DONAU_BlindedUniqueDonorIdentifier *blinded_udi = + &csr_data->ss->bkps[csr_data->position].blinded_udi; struct DONAU_UniqueDonorIdentifierHashP *udi_hash = csr_data->ss->h_udis; - union GNUNET_CRYPTO_BlindingSecretP *blinding_secret = &csr_data->ss->blinding_secrets[csr_data->position]; - struct DONAU_UniqueDonorIdentifierNonce *udi_nonce = &csr_data->ss->receipts[csr_data->position].nonce; + union GNUNET_CRYPTO_BlindingSecretP *blinding_secret = + &csr_data->ss->blinding_secrets[csr_data->position]; + struct DONAU_UniqueDonorIdentifierNonce *udi_nonce = + &csr_data->ss->receipts[csr_data->position].nonce; GNUNET_assert (GNUNET_CRYPTO_BSA_CS == cs_pk->bsign_pub_key->cipher); - GNUNET_assert (NULL == alg_values); - // TODO: write GNUNET method - TALER_denom_ewv_copy ((struct TALER_ExchangeWithdrawValues *) alg_values, - (struct TALER_ExchangeWithdrawValues *) &csrresp->details.ok.alg_values); - GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG, - &ps, - sizeof (ps)); - DONAU_budi_secret_create (&ps, - alg_values, - blinding_secret); - GNUNET_assert (GNUNET_OK == - DONAU_donation_unit_blind ( - cs_pk, - blinding_secret, - &csr_data->nonce, /* nonce only needed for cs */ - udi_nonce, - csr_data->ss->h_donor_tax_id, - alg_values, - udi_hash, - blinded_udi)); - csr_data->ss->cs_pending--; - if (0 == csr_data->ss->cs_pending) - phase_two (csr_data->ss); - GNUNET_free(csr_data); + + DONAU_donation_unit_ewv_copy ( alg_values, + &csrresp->details.ok. + alg_values); + GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG, + &ps, + sizeof (ps)); + DONAU_budi_secret_create (&ps, + alg_values, + blinding_secret); + GNUNET_assert (GNUNET_OK == + DONAU_donation_unit_blind ( + cs_pk, + blinding_secret, + &csr_data->nonce, /* nonce only needed for cs */ + udi_nonce, + csr_data->ss->h_donor_tax_id, + alg_values, + udi_hash, + blinded_udi)); + csr_data->ss->alg_values[csr_data->position] = alg_values; + csr_data->ss->cs_pending--; + if (0 == csr_data->ss->cs_pending) + phase_two (csr_data->ss); + GNUNET_free (csr_data); } + /** * Run the command. * @@ -346,8 +352,8 @@ status_run (void *cls, GNUNET_new_array (ss->num_bkp, struct DONAU_UniqueDonorIdentifierHashP); for (size_t cnt = 0; cnt < ss->num_bkp; cnt++) { - DONAU_donation_unit_pub_hash (&ss->keys->donation_unit_keys[0].key, - &ss->bkps[cnt].h_donation_unit_pub); + DONAU_donation_unit_pub_hash (&ss->keys->donation_unit_keys[0].key, + &ss->bkps[cnt].h_donation_unit_pub); struct DONAU_UniqueDonorIdentifierNonce *udi_nonce = &ss->receipts[cnt].nonce; struct DONAU_BudiMasterSecretP ps; @@ -363,45 +369,45 @@ status_run (void *cls, sizeof (*udi_nonce)); switch (ss->keys->donation_unit_keys[0].key.bsign_pub_key->cipher) { - case GNUNET_CRYPTO_BSA_RSA: - alg_values = DONAU_donation_unit_ewv_rsa_singleton (); - DONAU_budi_secret_create (&ps, - alg_values, - &ss->blinding_secrets[cnt]); - GNUNET_assert (GNUNET_OK == - DONAU_donation_unit_blind ( - &ss->keys->donation_unit_keys[0].key, - &ss->blinding_secrets[cnt], - NULL, /* no cs-nonce needed for rsa */ - udi_nonce, - ss->h_donor_tax_id, - alg_values, - udi_hash, - blinded_udi)); - ss->alg_values[cnt] = alg_values; - break; - case GNUNET_CRYPTO_BSA_CS: - struct CSR_Data *csr_data = GNUNET_new (struct CSR_Data); - TALER_cs_withdraw_nonce_derive ( // TODO: write new method - (struct TALER_PlanchetMasterSecretP *) &ps, - &csr_data->nonce.cs_nonce); - csr_data->ss = ss; - csr_data->position = cnt; - csr_data->csr_handle = DONAU_csr_issue ( - TALER_TESTING_interpreter_get_context (is), - TALER_TESTING_get_donau_url (is), - &ss->keys->donation_unit_keys[0].key, - &csr_data->nonce.cs_nonce, - &cs_stage_two_callback, - csr_data); - if (NULL == csr_data->csr_handle) - { - GNUNET_break (0); - } - ss->cs_pending++; - break; - default: - GNUNET_break (0); + case GNUNET_CRYPTO_BSA_RSA: + alg_values = DONAU_donation_unit_ewv_rsa_singleton (); + DONAU_budi_secret_create (&ps, + alg_values, + &ss->blinding_secrets[cnt]); + GNUNET_assert (GNUNET_OK == + DONAU_donation_unit_blind ( + &ss->keys->donation_unit_keys[0].key, + &ss->blinding_secrets[cnt], + NULL, /* no cs-nonce needed for rsa */ + udi_nonce, + ss->h_donor_tax_id, + alg_values, + udi_hash, + blinded_udi)); + ss->alg_values[cnt] = alg_values; + break; + case GNUNET_CRYPTO_BSA_CS: + struct CSR_Data *csr_data = GNUNET_new (struct CSR_Data); + TALER_cs_withdraw_nonce_derive ( // TODO: write new method + (struct TALER_PlanchetMasterSecretP *) &ps, + &csr_data->nonce.cs_nonce); + csr_data->ss = ss; + csr_data->position = cnt; + csr_data->csr_handle = DONAU_csr_issue ( + TALER_TESTING_interpreter_get_context (is), + TALER_TESTING_get_donau_url (is), + &ss->keys->donation_unit_keys[0].key, + &csr_data->nonce.cs_nonce, + &cs_stage_two_callback, + csr_data); + if (NULL == csr_data->csr_handle) + { + GNUNET_break (0); + } + ss->cs_pending++; + break; + default: + GNUNET_break (0); } } if (0 == ss->cs_pending) @@ -463,10 +469,10 @@ issue_receipts_traits (void *cls, struct StatusState *ss = cls; struct TALER_TESTING_Trait traits[] = { TALER_TESTING_make_trait_salted_tax_id_hash ( - (const struct DONAU_HashDonorTaxId *) ss->h_donor_tax_id), - TALER_TESTING_make_trait_donation_receipts ( - (const struct DONAU_DonationReceipt **) &ss->receipts), - TALER_TESTING_make_trait_number_receipts ((const size_t *) &ss->num_bkp), + (const struct DONAU_HashDonorTaxId *) ss->h_donor_tax_id), + TALER_TESTING_make_trait_donation_receipts ( + (const struct DONAU_DonationReceipt **) &ss->receipts), + TALER_TESTING_make_trait_number_receipts ((const size_t *) &ss->num_bkp), TALER_TESTING_trait_end () }; diff --git a/src/util/donau_crypto.c b/src/util/donau_crypto.c @@ -289,4 +289,17 @@ DONAU_donation_unit_ewv_rsa_singleton () .blinding_inputs = &bi }; return &alg_values; +} + +void +DONAU_donation_unit_ewv_copy (struct DONAU_BatchIssueValues *bi_dst, + const struct DONAU_BatchIssueValues *bi_src) +{ + if (bi_src == DONAU_donation_unit_ewv_rsa_singleton ()) + { + *bi_dst = *bi_src; + return; + } + bi_dst->blinding_inputs + = GNUNET_CRYPTO_blinding_input_values_incref (bi_src->blinding_inputs); } \ No newline at end of file