donau

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

commit e3d4b6e27296916afb5fa675b0534d6212a4927f
parent 774d506cd09f0f321ec09890a5505aa3c89464fb
Author: Matyja Lukas Adam <lukas.matyja@students.bfh.ch>
Date:   Tue, 16 Jan 2024 13:59:33 +0100

Merge remote-tracking branch 'refs/remotes/origin/master'

Diffstat:
Mci/jobs/2-test/test.sh | 2+-
Msrc/donau/donau-httpd.c | 30++++++++++++++++++++++++++++--
Msrc/donau/donau-httpd_charity.h | 4++--
Msrc/donau/donau-httpd_get-charity.c | 11+----------
Msrc/donau/donau-httpd_keys.c | 4++--
Msrc/donau/test_donau_httpd.conf | 2+-
Msrc/donau/test_donau_unix.conf | 2+-
Msrc/donaudb/donaudb-postgres.conf | 2+-
Msrc/donaudb/test-donau-db-postgres.conf | 2+-
Msrc/pq/test_pq.c | 2+-
Msrc/testing/test_donau_api.conf | 2+-
Msrc/util/Makefile.am | 12+++++++++++-
Dsrc/util/crypto_helper_common.c | 51---------------------------------------------------
Dsrc/util/crypto_helper_common.h | 41-----------------------------------------
Dsrc/util/crypto_helper_cs.c | 1317-------------------------------------------------------------------------------
Dsrc/util/crypto_helper_esign.c | 557-------------------------------------------------------------------------------
Dsrc/util/crypto_helper_rsa.c | 917-------------------------------------------------------------------------------
Asrc/util/donau-secmod-rsa.conf | 27+++++++++++++++++++++++++++
Asrc/util/paths.conf | 29+++++++++++++++++++++++++++++
19 files changed, 107 insertions(+), 2907 deletions(-)

diff --git a/ci/jobs/2-test/test.sh b/ci/jobs/2-test/test.sh @@ -11,7 +11,7 @@ make install sudo -u postgres /usr/lib/postgresql/15/bin/postgres -D /etc/postgresql/15/main -h localhost -p 5432 & sleep 10 sudo -u postgres createuser -p 5432 root -sudo -u postgres createdb -p 5432 -O root talercheck +sudo -u postgres createdb -p 5432 -O root donaucheck check_command() { diff --git a/src/donau/donau-httpd.c b/src/donau/donau-httpd.c @@ -34,6 +34,7 @@ #include "donau-httpd_config.h" #include "donau-httpd_keys.h" #include "donau-httpd_charity.h" +#include "donau-httpd_history.h" #include "donau-httpd_terms.h" #include "donaudb_plugin.h" #include <gnunet/gnunet_mhd_compat.h> @@ -52,7 +53,7 @@ * Above what request latency do we start to log? */ #define WARN_LATENCY GNUNET_TIME_relative_multiply ( \ - GNUNET_TIME_UNIT_MILLISECONDS, 500) + GNUNET_TIME_UNIT_MILLISECONDS, 500) /** * Are clients allowed to request /keys for times other than the @@ -388,6 +389,29 @@ proceed_with_handler (struct DH_RequestContext *rc, /** + * Handle a "/charities/$CHARITY_ID" GET request. + * + * @param rc request context + * @param optional charity id (args[0]) + * @return MHD result code + */ +static MHD_RESULT +handle_get_charities (struct DH_RequestContext *rc, + const char *const args[1]) +{ + if (NULL == args[0]) + { + return DH_handler_charities_get (rc); + } + else + { + return DH_handler_charity_get (rc, + args[0]); + } +} + + +/** * Handle incoming HTTP request. * * @param cls closure for MHD daemon (unused) @@ -448,7 +472,9 @@ handle_mhd_request (void *cls, { .url = "charities", .method = MHD_HTTP_METHOD_GET, - .handler.get = &DH_handler_charities_get + .handler.get = &handle_get_charities, + .nargs = 1, + .nargs_is_upper_bound = true }, /* POST charities */ { diff --git a/src/donau/donau-httpd_charity.h b/src/donau/donau-httpd_charity.h @@ -40,7 +40,7 @@ DH_handler_charity_post ( /** - * Handle a GET "/charity" request. + * Handle a GET "/charities/$CHARITY_ID" request. * * @param rc request context * @param args GET arguments (should be one) @@ -49,7 +49,7 @@ DH_handler_charity_post ( MHD_RESULT DH_handler_charity_get ( struct DH_RequestContext *rc, - const char *const args[]); + const char *const args[1]); /** diff --git a/src/donau/donau-httpd_get-charity.c b/src/donau/donau-httpd_get-charity.c @@ -40,7 +40,7 @@ MHD_RESULT DH_handler_charity_get ( struct DH_RequestContext *rc, - const char *const args[]) + const char *const args[1]) { unsigned long long charity_id; char dummy; @@ -58,15 +58,6 @@ DH_handler_charity_get ( "charity_id"); } - if (NULL != args[1]) - { - GNUNET_break_op (0); - return TALER_MHD_reply_with_error (rc->connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_GENERIC_ENDPOINT_UNKNOWN, - args[1]); - } - { struct DONAUDB_CharityMetaData meta; enum GNUNET_DB_QueryStatus qs; diff --git a/src/donau/donau-httpd_keys.c b/src/donau/donau-httpd_keys.c @@ -1199,7 +1199,7 @@ setup_key_helpers (struct HelperState *hs) hs->esign_keys = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_NO /* MUST BE NO! */); - hs->rsadh = DONAU_CRYPTO_helper_rsa_connect (DH_cfg, + hs->rsadh = TALER_CRYPTO_helper_rsa_connect (DH_cfg, "donau", &helper_rsa_cb, hs); @@ -1208,7 +1208,7 @@ setup_key_helpers (struct HelperState *hs) destroy_key_helpers (hs); return GNUNET_SYSERR; } - hs->csdh = DONAU_CRYPTO_helper_cs_connect (DH_cfg, + hs->csdh = TALER_CRYPTO_helper_cs_connect (DH_cfg, "donau", &helper_cs_cb, hs); diff --git a/src/donau/test_donau_httpd.conf b/src/donau/test_donau_httpd.conf @@ -53,7 +53,7 @@ IDLE_RESERVE_EXPIRATION_TIME = 4 weeks [donaudb-postgres] -CONFIG = "postgres:///talercheck" +CONFIG = "postgres:///donaucheck" [donau-account-1] PAYTO_URI = "payto://x-taler-bank/localhost:8082/3" diff --git a/src/donau/test_donau_unix.conf b/src/donau/test_donau_unix.conf @@ -58,7 +58,7 @@ IDLE_RESERVE_EXPIRATION_TIME = 4 weeks [donaudb-postgres] -CONFIG = "postgres:///talercheck" +CONFIG = "postgres:///donaucheck" [donau-account-1] PAYTO_URI = "payto://x-taler-bank/localhost:8082/3" diff --git a/src/donaudb/donaudb-postgres.conf b/src/donaudb/donaudb-postgres.conf @@ -1,5 +1,5 @@ [donaudb-postgres] -CONFIG = "postgres:///talercheck" +CONFIG = "postgres:///donaucheck" # Where are the SQL files to setup our tables? # Important: this MUST end with a "/"! diff --git a/src/donaudb/test-donau-db-postgres.conf b/src/donaudb/test-donau-db-postgres.conf @@ -7,7 +7,7 @@ BASE_URL = http://localhost/ [donaudb-postgres] #The connection string the plugin has to use for connecting to the database -CONFIG = postgres:///talercheck +CONFIG = postgres:///donaucheck # Where are the SQL files to setup our tables? SQL_DIR = $DATADIR/sql/donau/ diff --git a/src/pq/test_pq.c b/src/pq/test_pq.c @@ -211,7 +211,7 @@ main (int argc, GNUNET_log_setup ("test-pq", "WARNING", NULL); - conn = GNUNET_PQ_connect ("postgres:///talercheck", + conn = GNUNET_PQ_connect ("postgres:///donaucheck", NULL, es, NULL); diff --git a/src/testing/test_donau_api.conf b/src/testing/test_donau_api.conf @@ -20,7 +20,7 @@ EXPIRE_IDLE_SLEEP_INTERVAL ="1 s" #MAX_KEYS_CACHING = forever [donaudb-postgres] -CONFIG = "postgres:///talercheck" +CONFIG = "postgres:///donaucheck" [donaudb] # IDLE_RESERVE_EXPIRATION_TIME = 0 s diff --git a/src/util/Makefile.am b/src/util/Makefile.am @@ -7,7 +7,16 @@ if USE_COVERAGE endif -pkgcfgdir = $(prefix)/share/taler/config.d/ +pkgcfgdir = $(prefix)/share/donau/config.d/ + +pkgcfg_DATA = \ + currencies.conf \ + paths.conf \ + donau-secmod-eddsa.conf \ + donau-secmod-rsa.conf \ + donau-secmod-cs.conf + + lib_LTLIBRARIES = \ libdonauutil.la @@ -32,6 +41,7 @@ libdonauutil_la_LIBADD = \ -lm EXTRA_DIST = \ + $(pkgcfg_DATA) \ donau-config.in bin_SCRIPTS = \ diff --git a/src/util/crypto_helper_common.c b/src/util/crypto_helper_common.c @@ -1,51 +0,0 @@ -/* - This file is part of TALER - Copyright (C) 2020, 2021 Taler Systems SA - - TALER is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> -*/ -/** - * @file util/crypto_helper_common.c - * @brief Common functions for the exchange security modules - * @author Florian Dold <dold@taler.net> - */ -#include <taler/platform.h> -#include <taler/taler_util.h> -#include <taler/taler_signatures.h> - - -enum GNUNET_GenericReturnValue -TALER_crypto_helper_send_all (int sock, - const void *buf, - size_t buf_size) -{ - size_t off = 0; - - while (off < buf_size) - { - ssize_t ret; - - ret = send (sock, - buf + off, - buf_size - off, - 0); - if (ret < 0) - { - if (EINTR == errno) - continue; - return GNUNET_SYSERR; - } - GNUNET_assert (ret > 0); - off += ret; - } - return GNUNET_OK; -} diff --git a/src/util/crypto_helper_common.h b/src/util/crypto_helper_common.h @@ -1,41 +0,0 @@ -/* - This file is part of GNU Taler - Copyright (C) 2021 Taler Systems SA - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - TALER; see the file COPYING. If not, see - <http://www.gnu.org/licenses/> -*/ -/** - * @file util/crypto_helper_common.h - * @brief Common functions for the exchange security modules - * @author Florian Dold <dold@taler.net> - */ -#ifndef CRYPTO_HELPER_COMMON_H -#define CRYPTO_HELPER_COMMON_H - -#include <gnunet/gnunet_util_lib.h> -#include <gnunet/gnunet_network_lib.h> - -/** - * Send all @a buf_size bytes from @a buf to @a sock. - * - * @param sock socket to send on - * @param buf data to send - * @param buf_size number of bytes in @a buf - * @return #GNUNET_OK on success - */ -enum GNUNET_GenericReturnValue -TALER_crypto_helper_send_all (int sock, - const void *buf, - size_t buf_size); - -#endif diff --git a/src/util/crypto_helper_cs.c b/src/util/crypto_helper_cs.c @@ -1,1317 +0,0 @@ -/* - This file is part of TALER - Copyright (C) 2020-2024 Taler Systems SA - - TALER is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> -*/ -/** - * @file util/crypto_helper_cs.c - * @brief utility functions for running out-of-process private key operations - * @author Christian Grothoff - * @author Pius Loosli - */ -#include "taler/platform.h" -#include "taler/taler_util.h" -#include "taler/taler_signatures.h" -#include "taler/taler-exchange-secmod-cs.h" -#include <poll.h> -#include "crypto_helper_common.h" -#include "donau_util.h" - -struct DONAU_CRYPTO_CsDonationUnitHelper -{ - /** - * Function to call with updates to available key material. - */ - DONAU_CRYPTO_CsDonationUnitKeyStatusCallback dkc; - - /** - * Closure for @e dkc - */ - void *dkc_cls; - - /** - * Socket address of the donation unit helper process. - * Used to reconnect if the connection breaks. - */ - struct sockaddr_un sa; - - /** - * The UNIX domain socket, -1 if we are currently not connected. - */ - int sock; - - /** - * Have we ever been sync'ed? - */ - bool synced; -}; - - -/** - * Disconnect from the helper process. Updates - * @e sock field in @a dh. - * - * @param[in,out] dh handle to tear down connection of - */ -static void -do_disconnect (struct DONAU_CRYPTO_CsDonationUnitHelper *dh) -{ - GNUNET_break (0 == close (dh->sock)); - dh->sock = -1; - dh->synced = false; -} - - -/** - * Try to connect to the helper process. Updates - * @e sock field in @a dh. - * - * @param[in,out] dh handle to establish connection for - * @return #GNUNET_OK on success - */ -static enum GNUNET_GenericReturnValue -try_connect (struct DONAU_CRYPTO_CsDonationUnitHelper *dh) -{ - if (-1 != dh->sock) - return GNUNET_OK; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Establishing connection!\n"); - dh->sock = socket (AF_UNIX, - SOCK_STREAM, - 0); - if (-1 == dh->sock) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "socket"); - return GNUNET_SYSERR; - } - if (0 != - connect (dh->sock, - (const struct sockaddr *) &dh->sa, - sizeof (dh->sa))) - { - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, - "connect", - dh->sa.sun_path); - do_disconnect (dh); - return GNUNET_SYSERR; - } - DONAU_CRYPTO_helper_cs_poll (dh); - return GNUNET_OK; -} - - -struct DONAU_CRYPTO_CsDonationUnitHelper * -DONAU_CRYPTO_helper_cs_connect ( - const struct GNUNET_CONFIGURATION_Handle *cfg, - const char *section, - DONAU_CRYPTO_CsDonationUnitKeyStatusCallback dkc, - void *dkc_cls) -{ - struct DONAU_CRYPTO_CsDonationUnitHelper *dh; - char *unixpath; - char *secname; - - GNUNET_asprintf (&secname, - "%s-exchange-secmod-cs", - section); - if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_filename (cfg, - secname, - "UNIXPATH", - &unixpath)) - { - GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, - secname, - "UNIXPATH"); - GNUNET_free (secname); - return NULL; - } - /* we use >= here because we want the sun_path to always - be 0-terminated */ - if (strlen (unixpath) >= sizeof (dh->sa.sun_path)) - { - GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR, - secname, - "UNIXPATH", - "path too long"); - GNUNET_free (unixpath); - GNUNET_free (secname); - return NULL; - } - GNUNET_free (secname); - dh = GNUNET_new (struct DONAU_CRYPTO_CsDonationUnitHelper); - dh->dkc = dkc; - dh->dkc_cls = dkc_cls; - dh->sa.sun_family = AF_UNIX; - strncpy (dh->sa.sun_path, - unixpath, - sizeof (dh->sa.sun_path) - 1); - GNUNET_free (unixpath); - dh->sock = -1; - if (GNUNET_OK != - try_connect (dh)) - { - DONAU_CRYPTO_helper_cs_disconnect (dh); - return NULL; - } - return dh; -} - - -/** - * Handle a #DONAU_HELPER_CS_MT_AVAIL message from the helper. - * - * @param dh helper context - * @param hdr message that we received - * @return #GNUNET_OK on success - */ -static enum GNUNET_GenericReturnValue -handle_mt_avail (struct DONAU_CRYPTO_CsDonationUnitHelper *dh, - const struct GNUNET_MessageHeader *hdr) -{ - const struct TALER_CRYPTO_CsKeyAvailableNotification *kan - = (const struct TALER_CRYPTO_CsKeyAvailableNotification *) hdr; - const char *buf = (const char *) &kan[1]; - const char *section_name; - uint16_t snl; - - if (sizeof (*kan) > ntohs (hdr->size)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - snl = ntohs (kan->section_name_len); - if (ntohs (hdr->size) != sizeof (*kan) + snl) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - if (0 == snl) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - section_name = buf; - if ('\0' != section_name[snl - 1]) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - - { - struct GNUNET_CRYPTO_BlindSignPublicKey *bsign_pub; - struct TALER_CsPubHashP h_cs; - - bsign_pub = GNUNET_new (struct GNUNET_CRYPTO_BlindSignPublicKey); - bsign_pub->cipher = GNUNET_CRYPTO_BSA_CS; - bsign_pub->rc = 1; - bsign_pub->details.cs_public_key = kan->denom_pub; - - GNUNET_CRYPTO_hash (&bsign_pub->details.cs_public_key, - sizeof (bsign_pub->details.cs_public_key), - &bsign_pub->pub_key_hash); - h_cs.hash = bsign_pub->pub_key_hash; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Received CS key %s (%s)\n", - GNUNET_h2s (&h_cs.hash), - section_name); - if (GNUNET_OK != - TALER_exchange_secmod_cs_verify ( - &h_cs, - section_name, - GNUNET_TIME_timestamp_ntoh (kan->anchor_time), - GNUNET_TIME_relative_ntoh (kan->duration_withdraw), - &kan->secm_pub, - &kan->secm_sig)) - { - GNUNET_break_op (0); - GNUNET_CRYPTO_blind_sign_pub_decref (bsign_pub); - return GNUNET_SYSERR; - } - dh->dkc (dh->dkc_cls, - section_name, - GNUNET_TIME_timestamp_ntoh (kan->anchor_time), - GNUNET_TIME_relative_ntoh (kan->duration_withdraw), - &h_cs, - bsign_pub, - &kan->secm_pub, - &kan->secm_sig); - GNUNET_CRYPTO_blind_sign_pub_decref (bsign_pub); - } - return GNUNET_OK; -} - - -/** - * Handle a #DONAU_HELPER_CS_MT_PURGE message from the helper. - * - * @param dh helper context - * @param hdr message that we received - * @return #GNUNET_OK on success - */ -static enum GNUNET_GenericReturnValue -handle_mt_purge (struct DONAU_CRYPTO_CsDonationUnitHelper *dh, - const struct GNUNET_MessageHeader *hdr) -{ - const struct TALER_CRYPTO_CsKeyPurgeNotification *pn - = (const struct TALER_CRYPTO_CsKeyPurgeNotification *) hdr; - - if (sizeof (*pn) != ntohs (hdr->size)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Received revocation of donation unit key %s\n", - GNUNET_h2s (&pn->h_cs.hash)); - dh->dkc (dh->dkc_cls, - NULL, - GNUNET_TIME_UNIT_ZERO_TS, - GNUNET_TIME_UNIT_ZERO, - &pn->h_cs, - NULL, - NULL, - NULL); - return GNUNET_OK; -} - - -void -DONAU_CRYPTO_helper_cs_poll (struct DONAU_CRYPTO_CsDonationUnitHelper *dh) -{ - char buf[UINT16_MAX]; - size_t off = 0; - unsigned int retry_limit = 3; - const struct GNUNET_MessageHeader *hdr - = (const struct GNUNET_MessageHeader *) buf; - - if (GNUNET_OK != - try_connect (dh)) - return; /* give up */ - while (1) - { - uint16_t msize; - ssize_t ret; - - ret = recv (dh->sock, - buf + off, - sizeof (buf) - off, - (dh->synced && (0 == off)) - ? MSG_DONTWAIT - : 0); - if (ret < 0) - { - if (EINTR == errno) - continue; - if (EAGAIN == errno) - { - GNUNET_assert (dh->synced); - GNUNET_assert (0 == off); - break; - } - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "recv"); - do_disconnect (dh); - if (0 == retry_limit) - return; /* give up */ - if (GNUNET_OK != - try_connect (dh)) - return; /* give up */ - retry_limit--; - continue; - } - if (0 == ret) - { - GNUNET_break (0 == off); - return; - } - off += ret; -more: - if (off < sizeof (struct GNUNET_MessageHeader)) - continue; - msize = ntohs (hdr->size); - if (off < msize) - continue; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Received message of type %u and length %u\n", - (unsigned int) ntohs (hdr->type), - (unsigned int) msize); - switch (ntohs (hdr->type)) - { - case TALER_HELPER_CS_MT_AVAIL: - if (GNUNET_OK != - handle_mt_avail (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return; - } - break; - case TALER_HELPER_CS_MT_PURGE: - if (GNUNET_OK != - handle_mt_purge (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return; - } - break; - case TALER_HELPER_CS_SYNCED: - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Now synchronized with CS helper\n"); - dh->synced = true; - break; - default: - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Received unexpected message of type %d (len: %u)\n", - (unsigned int) ntohs (hdr->type), - (unsigned int) msize); - GNUNET_break_op (0); - do_disconnect (dh); - return; - } - memmove (buf, - &buf[msize], - off - msize); - off -= msize; - goto more; - } -} - - -enum TALER_ErrorCode -DONAU_CRYPTO_helper_cs_sign ( - struct DONAU_CRYPTO_CsDonationUnitHelper *dh, - const struct TALER_CRYPTO_CsSignRequest *req, - bool for_melt, - struct DONAU_BlindedDonationUnitSignature *bs) -{ - enum TALER_ErrorCode ec = TALER_EC_INVALID; - const struct TALER_CsPubHashP *h_cs = req->h_cs; - - memset (bs, - 0, - sizeof (*bs)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Starting signature process\n"); - if (GNUNET_OK != - try_connect (dh)) - { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Failed to connect to helper\n"); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Requesting signature\n"); - { - char buf[sizeof (struct TALER_CRYPTO_CsSignRequestMessage)]; - struct TALER_CRYPTO_CsSignRequestMessage *sr - = (struct TALER_CRYPTO_CsSignRequestMessage *) buf; - - sr->header.size = htons (sizeof (buf)); - sr->header.type = htons (TALER_HELPER_CS_MT_REQ_SIGN); - sr->for_melt = htonl (for_melt ? 1 : 0); - sr->h_cs = *h_cs; - sr->message = *req->blinded_planchet; - if (GNUNET_OK != - TALER_crypto_helper_send_all (dh->sock, - buf, - sizeof (buf))) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "send"); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Awaiting reply\n"); - { - char buf[UINT16_MAX]; - size_t off = 0; - const struct GNUNET_MessageHeader *hdr - = (const struct GNUNET_MessageHeader *) buf; - bool finished = false; - - while (1) - { - uint16_t msize; - ssize_t ret; - - ret = recv (dh->sock, - &buf[off], - sizeof (buf) - off, - (finished && (0 == off)) - ? MSG_DONTWAIT - : 0); - if (ret < 0) - { - if (EINTR == errno) - continue; - if (EAGAIN == errno) - { - GNUNET_assert (finished); - GNUNET_assert (0 == off); - return ec; - } - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "recv"); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - break; - } - if (0 == ret) - { - GNUNET_break (0 == off); - if (! finished) - ec = TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; - return ec; - } - off += ret; -more: - if (off < sizeof (struct GNUNET_MessageHeader)) - continue; - msize = ntohs (hdr->size); - if (off < msize) - continue; - switch (ntohs (hdr->type)) - { - case TALER_HELPER_CS_MT_RES_SIGNATURE: - if (msize != sizeof (struct TALER_CRYPTO_SignResponse)) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - if (finished) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - { - const struct TALER_CRYPTO_SignResponse *sr = - (const struct TALER_CRYPTO_SignResponse *) buf; - struct GNUNET_CRYPTO_BlindedSignature *blinded_sig; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received signature\n"); - ec = TALER_EC_NONE; - finished = true; - blinded_sig = GNUNET_new (struct GNUNET_CRYPTO_BlindedSignature); - blinded_sig->cipher = GNUNET_CRYPTO_BSA_CS; - blinded_sig->rc = 1; - blinded_sig->details.blinded_cs_answer.b = ntohl (sr->b); - blinded_sig->details.blinded_cs_answer.s_scalar = sr->cs_answer; - bs->blinded_sig = blinded_sig; - break; - } - case TALER_HELPER_CS_MT_RES_SIGN_FAILURE: - if (msize != sizeof (struct TALER_CRYPTO_SignFailure)) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - { - const struct TALER_CRYPTO_SignFailure *sf = - (const struct TALER_CRYPTO_SignFailure *) buf; - - ec = (enum TALER_ErrorCode) ntohl (sf->ec); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Signing failed with status %d!\n", - ec); - finished = true; - break; - } - case TALER_HELPER_CS_MT_AVAIL: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received new key!\n"); - if (GNUNET_OK != - handle_mt_avail (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_CS_MT_PURGE: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received revocation!\n"); - if (GNUNET_OK != - handle_mt_purge (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_CS_SYNCED: - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Synchronized add odd time with CS helper!\n"); - dh->synced = true; - break; - default: - GNUNET_break_op (0); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Received unexpected message of type %u\n", - ntohs (hdr->type)); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - memmove (buf, - &buf[msize], - off - msize); - off -= msize; - goto more; - } /* while(1) */ -end: - if (finished) -// DONAU_blinded_donation_unit_sig_free (bs); - return ec; - } -} - - -void -DONAU_CRYPTO_helper_cs_revoke ( - struct DONAU_CRYPTO_CsDonationUnitHelper *dh, - const struct TALER_CsPubHashP *h_cs) -{ - struct TALER_CRYPTO_CsRevokeRequest rr = { - .header.size = htons (sizeof (rr)), - .header.type = htons (TALER_HELPER_CS_MT_REQ_REVOKE), - .h_cs = *h_cs - }; - - if (GNUNET_OK != - try_connect (dh)) - return; /* give up */ - if (GNUNET_OK != - TALER_crypto_helper_send_all (dh->sock, - &rr, - sizeof (rr))) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "send"); - do_disconnect (dh); - return; - } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Requested revocation of donation unit key %s\n", - GNUNET_h2s (&h_cs->hash)); -} - - -enum TALER_ErrorCode -DONAU_CRYPTO_helper_cs_r_derive (struct DONAU_CRYPTO_CsDonationUnitHelper *dh, - const struct TALER_CRYPTO_CsDeriveRequest *cdr, - bool for_melt, - struct GNUNET_CRYPTO_CSPublicRPairP *crp) -{ - enum TALER_ErrorCode ec = TALER_EC_INVALID; - const struct TALER_CsPubHashP *h_cs = cdr->h_cs; - const struct GNUNET_CRYPTO_CsSessionNonce *nonce = cdr->nonce; - - memset (crp, - 0, - sizeof (*crp)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Starting R derivation process\n"); - if (GNUNET_OK != - try_connect (dh)) - { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Failed to connect to helper\n"); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Requesting R\n"); - { - struct TALER_CRYPTO_CsRDeriveRequest rdr = { - .header.size = htons (sizeof (rdr)), - .header.type = htons (TALER_HELPER_CS_MT_REQ_RDERIVE), - .for_melt = htonl (for_melt ? 1 : 0), - .h_cs = *h_cs, - .nonce = *nonce - }; - - if (GNUNET_OK != - TALER_crypto_helper_send_all (dh->sock, - &rdr, - sizeof (rdr))) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "send"); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Awaiting reply\n"); - { - char buf[UINT16_MAX]; - size_t off = 0; - const struct GNUNET_MessageHeader *hdr - = (const struct GNUNET_MessageHeader *) buf; - bool finished = false; - - while (1) - { - uint16_t msize; - ssize_t ret; - - ret = recv (dh->sock, - &buf[off], - sizeof (buf) - off, - (finished && (0 == off)) - ? MSG_DONTWAIT - : 0); - if (ret < 0) - { - if (EINTR == errno) - continue; - if (EAGAIN == errno) - { - GNUNET_assert (finished); - GNUNET_assert (0 == off); - return ec; - } - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "recv"); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - if (0 == ret) - { - GNUNET_break (0 == off); - if (! finished) - return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; - return ec; - } - off += ret; -more: - if (off < sizeof (struct GNUNET_MessageHeader)) - continue; - msize = ntohs (hdr->size); - if (off < msize) - continue; - switch (ntohs (hdr->type)) - { - case TALER_HELPER_CS_MT_RES_RDERIVE: - if (msize != sizeof (struct TALER_CRYPTO_RDeriveResponse)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - if (finished) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - { - const struct TALER_CRYPTO_RDeriveResponse *rdr = - (const struct TALER_CRYPTO_RDeriveResponse *) buf; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received R\n"); - finished = true; - ec = TALER_EC_NONE; - *crp = rdr->r_pub; - break; - } - case TALER_HELPER_CS_MT_RES_RDERIVE_FAILURE: - if (msize != sizeof (struct TALER_CRYPTO_RDeriveFailure)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - { - const struct TALER_CRYPTO_RDeriveFailure *rdf = - (const struct TALER_CRYPTO_RDeriveFailure *) buf; - - ec = (enum TALER_ErrorCode) ntohl (rdf->ec); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "R derivation failed!\n"); - finished = true; - break; - } - case TALER_HELPER_CS_MT_AVAIL: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received new key!\n"); - if (GNUNET_OK != - handle_mt_avail (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_CS_MT_PURGE: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received revocation!\n"); - if (GNUNET_OK != - handle_mt_purge (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_CS_SYNCED: - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Synchronized add odd time with CS helper!\n"); - dh->synced = true; - break; - default: - GNUNET_break_op (0); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Received unexpected message of type %u\n", - ntohs (hdr->type)); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - memmove (buf, - &buf[msize], - off - msize); - off -= msize; - goto more; - } /* while(1) */ - } -} - - -enum TALER_ErrorCode -DONAU_CRYPTO_helper_cs_batch_sign ( - struct DONAU_CRYPTO_CsDonationUnitHelper *dh, - unsigned int reqs_length, - const struct TALER_CRYPTO_CsSignRequest reqs[static reqs_length], - bool for_melt, - struct DONAU_BlindedDonationUnitSignature bss[static reqs_length]) -{ - enum TALER_ErrorCode ec = TALER_EC_INVALID; - unsigned int rpos; - unsigned int rend; - unsigned int wpos; - - memset (bss, - 0, - sizeof (*bss) * reqs_length); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Starting signature process\n"); - if (GNUNET_OK != - try_connect (dh)) - { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Failed to connect to helper\n"); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Requesting %u signatures\n", - reqs_length); - rpos = 0; - rend = 0; - wpos = 0; - while (rpos < reqs_length) - { - unsigned int mlen = sizeof (struct TALER_CRYPTO_BatchSignRequest); - - while ( (rend < reqs_length) && - (mlen + sizeof (struct TALER_CRYPTO_CsSignRequestMessage) - < UINT16_MAX) ) - { - mlen += sizeof (struct TALER_CRYPTO_CsSignRequestMessage); - rend++; - } - { - char obuf[mlen] GNUNET_ALIGN; - struct TALER_CRYPTO_BatchSignRequest *bsr - = (struct TALER_CRYPTO_BatchSignRequest *) obuf; - void *wbuf; - - bsr->header.type = htons (TALER_HELPER_CS_MT_REQ_BATCH_SIGN); - bsr->header.size = htons (mlen); - bsr->batch_size = htonl (rend - rpos); - wbuf = &bsr[1]; - for (unsigned int i = rpos; i<rend; i++) - { - struct TALER_CRYPTO_CsSignRequestMessage *csm = wbuf; - const struct TALER_CRYPTO_CsSignRequest *csr = &reqs[i]; - - csm->header.size = htons (sizeof (*csm)); - csm->header.type = htons (TALER_HELPER_CS_MT_REQ_SIGN); - csm->for_melt = htonl (for_melt ? 1 : 0); - csm->h_cs = *csr->h_cs; - csm->message = *csr->blinded_planchet; - wbuf += sizeof (*csm); - } - GNUNET_assert (wbuf == &obuf[mlen]); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending batch request [%u-%u)\n", - rpos, - rend); - if (GNUNET_OK != - TALER_crypto_helper_send_all (dh->sock, - obuf, - sizeof (obuf))) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "send"); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - } /* end of obuf scope */ - rpos = rend; - { - char buf[UINT16_MAX]; - size_t off = 0; - const struct GNUNET_MessageHeader *hdr - = (const struct GNUNET_MessageHeader *) buf; - bool finished = false; - - while (1) - { - uint16_t msize; - ssize_t ret; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Awaiting reply at %u (up to %u)\n", - wpos, - rend); - ret = recv (dh->sock, - &buf[off], - sizeof (buf) - off, - (finished && (0 == off)) - ? MSG_DONTWAIT - : 0); - if (ret < 0) - { - if (EINTR == errno) - continue; - if (EAGAIN == errno) - { - GNUNET_assert (finished); - GNUNET_assert (0 == off); - break; - } - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "recv"); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - if (0 == ret) - { - GNUNET_break (0 == off); - if (! finished) - return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; - if (TALER_EC_NONE == ec) - break; - return ec; - } - off += ret; -more: - if (off < sizeof (struct GNUNET_MessageHeader)) - continue; - msize = ntohs (hdr->size); - if (off < msize) - continue; - switch (ntohs (hdr->type)) - { - case TALER_HELPER_CS_MT_RES_SIGNATURE: - if (msize != sizeof (struct TALER_CRYPTO_SignResponse)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - if (finished) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - { - const struct TALER_CRYPTO_SignResponse *sr = - (const struct TALER_CRYPTO_SignResponse *) buf; - struct GNUNET_CRYPTO_BlindedSignature *blinded_sig; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received %u signature\n", - wpos); - blinded_sig = GNUNET_new (struct GNUNET_CRYPTO_BlindedSignature); - blinded_sig->cipher = GNUNET_CRYPTO_BSA_CS; - blinded_sig->rc = 1; - blinded_sig->details.blinded_cs_answer.b = ntohl (sr->b); - blinded_sig->details.blinded_cs_answer.s_scalar = sr->cs_answer; - - bss[wpos].blinded_sig = blinded_sig; - wpos++; - if (wpos == rend) - { - if (TALER_EC_INVALID == ec) - ec = TALER_EC_NONE; - finished = true; - } - break; - } - - case TALER_HELPER_CS_MT_RES_SIGN_FAILURE: - if (msize != sizeof (struct TALER_CRYPTO_SignFailure)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - { - const struct TALER_CRYPTO_SignFailure *sf = - (const struct TALER_CRYPTO_SignFailure *) buf; - - ec = (enum TALER_ErrorCode) ntohl (sf->ec); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Signing %u failed with status %d!\n", - wpos, - ec); - wpos++; - if (wpos == rend) - { - finished = true; - } - break; - } - case TALER_HELPER_CS_MT_AVAIL: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received new key!\n"); - if (GNUNET_OK != - handle_mt_avail (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_CS_MT_PURGE: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received revocation!\n"); - if (GNUNET_OK != - handle_mt_purge (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_CS_SYNCED: - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Synchronized add odd time with CS helper!\n"); - dh->synced = true; - break; - default: - GNUNET_break_op (0); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Received unexpected message of type %u\n", - ntohs (hdr->type)); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - memmove (buf, - &buf[msize], - off - msize); - off -= msize; - goto more; - } /* while(1) */ - } /* scope */ - } /* while (rpos < cdrs_length) */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Existing with %u signatures and status %d\n", - wpos, - ec); - return ec; -} - - -enum TALER_ErrorCode -DONAU_CRYPTO_helper_cs_r_batch_derive ( - struct DONAU_CRYPTO_CsDonationUnitHelper *dh, - unsigned int cdrs_length, - const struct TALER_CRYPTO_CsDeriveRequest cdrs[static cdrs_length], - bool for_melt, - struct GNUNET_CRYPTO_CSPublicRPairP crps[static cdrs_length]) -{ - enum TALER_ErrorCode ec = TALER_EC_INVALID; - unsigned int rpos; - unsigned int rend; - unsigned int wpos; - - memset (crps, - 0, - sizeof (*crps) * cdrs_length); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Starting R derivation process\n"); - if (GNUNET_OK != - try_connect (dh)) - { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Failed to connect to helper\n"); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Requesting %u R pairs\n", - cdrs_length); - rpos = 0; - rend = 0; - wpos = 0; - while (rpos < cdrs_length) - { - unsigned int mlen = sizeof (struct TALER_CRYPTO_BatchDeriveRequest); - - while ( (rend < cdrs_length) && - (mlen + sizeof (struct TALER_CRYPTO_CsRDeriveRequest) - < UINT16_MAX) ) - { - mlen += sizeof (struct TALER_CRYPTO_CsRDeriveRequest); - rend++; - } - { - char obuf[mlen] GNUNET_ALIGN; - struct TALER_CRYPTO_BatchDeriveRequest *bdr - = (struct TALER_CRYPTO_BatchDeriveRequest *) obuf; - void *wbuf; - - bdr->header.type = htons (TALER_HELPER_CS_MT_REQ_BATCH_RDERIVE); - bdr->header.size = htons (mlen); - bdr->batch_size = htonl (rend - rpos); - wbuf = &bdr[1]; - for (unsigned int i = rpos; i<rend; i++) - { - struct TALER_CRYPTO_CsRDeriveRequest *rdr = wbuf; - const struct TALER_CRYPTO_CsDeriveRequest *cdr = &cdrs[i]; - - rdr->header.size = htons (sizeof (*rdr)); - rdr->header.type = htons (TALER_HELPER_CS_MT_REQ_RDERIVE); - rdr->for_melt = htonl (for_melt ? 1 : 0); - rdr->h_cs = *cdr->h_cs; - rdr->nonce = *cdr->nonce; - wbuf += sizeof (*rdr); - } - GNUNET_assert (wbuf == &obuf[mlen]); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending batch request [%u-%u)\n", - rpos, - rend); - if (GNUNET_OK != - TALER_crypto_helper_send_all (dh->sock, - obuf, - sizeof (obuf))) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "send"); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - } /* end of obuf scope */ - rpos = rend; - { - char buf[UINT16_MAX]; - size_t off = 0; - const struct GNUNET_MessageHeader *hdr - = (const struct GNUNET_MessageHeader *) buf; - bool finished = false; - - while (1) - { - uint16_t msize; - ssize_t ret; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Awaiting reply at %u (up to %u)\n", - wpos, - rend); - ret = recv (dh->sock, - &buf[off], - sizeof (buf) - off, - (finished && (0 == off)) - ? MSG_DONTWAIT - : 0); - if (ret < 0) - { - if (EINTR == errno) - continue; - if (EAGAIN == errno) - { - GNUNET_assert (finished); - GNUNET_assert (0 == off); - break; - } - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "recv"); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - if (0 == ret) - { - GNUNET_break (0 == off); - if (! finished) - return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; - if (TALER_EC_NONE == ec) - break; - return ec; - } - off += ret; -more: - if (off < sizeof (struct GNUNET_MessageHeader)) - continue; - msize = ntohs (hdr->size); - if (off < msize) - continue; - switch (ntohs (hdr->type)) - { - case TALER_HELPER_CS_MT_RES_RDERIVE: - if (msize != sizeof (struct TALER_CRYPTO_RDeriveResponse)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - if (finished) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - { - const struct TALER_CRYPTO_RDeriveResponse *rdr = - (const struct TALER_CRYPTO_RDeriveResponse *) buf; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received %u R pair\n", - wpos); - crps[wpos] = rdr->r_pub; - wpos++; - if (wpos == rend) - { - if (TALER_EC_INVALID == ec) - ec = TALER_EC_NONE; - finished = true; - } - break; - } - case TALER_HELPER_CS_MT_RES_RDERIVE_FAILURE: - if (msize != sizeof (struct TALER_CRYPTO_RDeriveFailure)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - { - const struct TALER_CRYPTO_RDeriveFailure *rdf = - (const struct TALER_CRYPTO_RDeriveFailure *) buf; - - ec = (enum TALER_ErrorCode) ntohl (rdf->ec); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "R derivation %u failed with status %d!\n", - wpos, - ec); - wpos++; - if (wpos == rend) - { - finished = true; - } - break; - } - case TALER_HELPER_CS_MT_AVAIL: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received new key!\n"); - if (GNUNET_OK != - handle_mt_avail (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_CS_MT_PURGE: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received revocation!\n"); - if (GNUNET_OK != - handle_mt_purge (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_CS_SYNCED: - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Synchronized add odd time with CS helper!\n"); - dh->synced = true; - break; - default: - GNUNET_break_op (0); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Received unexpected message of type %u\n", - ntohs (hdr->type)); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - memmove (buf, - &buf[msize], - off - msize); - off -= msize; - goto more; - } /* while(1) */ - } /* scope */ - } /* while (rpos < cdrs_length) */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Existing with %u signatures and status %d\n", - wpos, - ec); - return ec; -} - - -void -DONAU_CRYPTO_helper_cs_disconnect ( - struct DONAU_CRYPTO_CsDonationUnitHelper *dh) -{ - if (-1 != dh->sock) - do_disconnect (dh); - GNUNET_free (dh); -} - - -/* end of crypto_helper_cs.c */ diff --git a/src/util/crypto_helper_esign.c b/src/util/crypto_helper_esign.c @@ -1,557 +0,0 @@ -/* - This file is part of TALER - Copyright (C) 2020-2024 Taler Systems SA - - TALER is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> -*/ -/** - * @file util/crypto_helper_esign.c - * @brief utility functions for running out-of-process private key operations - * @author Christian Grothoff - * @author Pius Loosli - */ -#include <taler/platform.h> -#include <taler/taler_util.h> -#include <taler/taler_signatures.h> -#include <taler/taler-exchange-secmod-eddsa.h> -#include <poll.h> -#include <crypto_helper_common.h> -#include "donau_util.h" - -struct DONAU_CRYPTO_DonauSignHelper -{ - /** - * Function to call with updates to available key material. - */ - DONAU_CRYPTO_DonauKeyStatusCallback dkc; - - /** - * Closure for @e dkc - */ - void *dkc_cls; - - /** - * Socket address of the denomination helper process. - * Used to reconnect if the connection breaks. - */ - struct sockaddr_un sa; - - /** - * The UNIX domain socket, -1 if we are currently not connected. - */ - int sock; - - /** - * Have we reached the sync'ed state? - */ - bool synced; - -}; - - -/** - * Disconnect from the helper process. Updates - * @e sock field in @a dsh. - * - * @param[in,out] dsh handle to tear down connection of - */ -static void -do_disconnect (struct DONAU_CRYPTO_DonauSignHelper *dsh) -{ - GNUNET_break (0 == close (dsh->sock)); - dsh->sock = -1; - dsh->synced = false; -} - - -/** - * Try to connect to the helper process. Updates - * @e sock field in @a dsh. - * - * @param[in,out] dsh handle to establish connection for - * @return #GNUNET_OK on success - */ -static enum GNUNET_GenericReturnValue -try_connect (struct DONAU_CRYPTO_DonauSignHelper *dsh) -{ - if (-1 != dsh->sock) - return GNUNET_OK; - dsh->sock = socket (AF_UNIX, - SOCK_STREAM, - 0); - if (-1 == dsh->sock) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "socket"); - return GNUNET_SYSERR; - } - if (0 != - connect (dsh->sock, - (const struct sockaddr *) &dsh->sa, - sizeof (dsh->sa))) - { - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, - "connect", - dsh->sa.sun_path); - do_disconnect (dsh); - return GNUNET_SYSERR; - } - return GNUNET_OK; -} - - -struct DONAU_CRYPTO_DonauSignHelper * -DONAU_CRYPTO_helper_esign_connect ( - const struct GNUNET_CONFIGURATION_Handle *cfg, - const char *section, - DONAU_CRYPTO_DonauKeyStatusCallback dkc, - void *dkc_cls) -{ - struct DONAU_CRYPTO_DonauSignHelper *dsh; - char *unixpath; - char *secname; - - GNUNET_asprintf (&secname, - "%s-exchange-secmod-eddsa", - section); - - if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_filename (cfg, - secname, - "UNIXPATH", - &unixpath)) - { - GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, - secname, - "UNIXPATH"); - GNUNET_free (secname); - return NULL; - } - /* we use >= here because we want the sun_path to always - be 0-terminated */ - if (strlen (unixpath) >= sizeof (dsh->sa.sun_path)) - { - GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR, - secname, - "UNIXPATH", - "path too long"); - GNUNET_free (unixpath); - GNUNET_free (secname); - return NULL; - } - GNUNET_free (secname); - dsh = GNUNET_new (struct DONAU_CRYPTO_DonauSignHelper); - dsh->dkc = dkc; - dsh->dkc_cls = dkc_cls; - dsh->sa.sun_family = AF_UNIX; - strncpy (dsh->sa.sun_path, - unixpath, - sizeof (dsh->sa.sun_path) - 1); - GNUNET_free (unixpath); - dsh->sock = -1; - if (GNUNET_OK != - try_connect (dsh)) - { - DONAU_CRYPTO_helper_esign_disconnect (dsh); - return NULL; - } - -// DONAU_CRYPTO_helper_esign_poll (dsh); - return dsh; -} - - -/** - * Handle a #TALER_HELPER_EDDSA_MT_AVAIL message from the helper. - * - * @param dsh helper context - * @param hdr message that we received - * @return #GNUNET_OK on success - */ -// static enum GNUNET_GenericReturnValue -// handle_mt_avail (struct DONAU_CRYPTO_DonauSignHelper *dsh, -// const struct GNUNET_MessageHeader *hdr) -// { -// const struct TALER_CRYPTO_EddsaKeyAvailableNotification *kan -// = (const struct TALER_CRYPTO_EddsaKeyAvailableNotification *) hdr; -// -// if (sizeof (*kan) != ntohs (hdr->size)) -// { -// GNUNET_break_op (0); -// return GNUNET_SYSERR; -// } -// -// if (GNUNET_OK != -// TALER_exchange_secmod_eddsa_verify ( -// &kan->exchange_pub, -// GNUNET_TIME_timestamp_ntoh (kan->anchor_time), -// GNUNET_TIME_relative_ntoh (kan->duration), -// &kan->secm_pub, -// &kan->secm_sig)) -// { -// GNUNET_break_op (0); -// return GNUNET_SYSERR; -// } -// dsh->dkc (dsh->dkc_cls, -// GNUNET_TIME_timestamp_ntoh (kan->anchor_time), -// GNUNET_TIME_relative_ntoh (kan->duration), -// &kan->donau_pub, -// &kan->secm_pub, -// &kan->secm_sig); -// return GNUNET_OK; -// } - - -/** - * Handle a #TALER_HELPER_EDDSA_MT_PURGE message from the helper. - * - * @param dsh helper context - * @param hdr message that we received - * @return #GNUNET_OK on success - */ -// static enum GNUNET_GenericReturnValue -// handle_mt_purge (struct DONAU_CRYPTO_DonauSignHelper *dsh, -// const struct GNUNET_MessageHeader *hdr) -// { -// const struct TALER_CRYPTO_EddsaKeyPurgeNotification *pn -// = (const struct TALER_CRYPTO_EddsaKeyPurgeNotification *) hdr; -// -// if (sizeof (*pn) != ntohs (hdr->size)) -// { -// GNUNET_break_op (0); -// return GNUNET_SYSERR; -// } -// dsh->dkc (dsh->dkc_cls, -// GNUNET_TIME_UNIT_ZERO_TS, -// GNUNET_TIME_UNIT_ZERO, -// &pn->exchange_pub, -// NULL, -// NULL); -// return GNUNET_OK; -// } - - -// void -// DONAU_CRYPTO_helper_esign_poll (struct DONAU_CRYPTO_DonauSignHelper *dsh) -// { -// char buf[UINT16_MAX]; -// size_t off = 0; -// unsigned int retry_limit = 3; -// const struct GNUNET_MessageHeader *hdr -// = (const struct GNUNET_MessageHeader *) buf; -// -// if (GNUNET_OK != -// try_connect (dsh)) -// return; /* give up */ -// while (1) -// { -// uint16_t msize; -// ssize_t ret; -// -// ret = recv (dsh->sock, -// buf + off, -// sizeof (buf) - off, -// (dsh->synced && (0 == off)) -// ? MSG_DONTWAIT -// : 0); -// if (ret < 0) -// { -// if (EINTR == errno) -// continue; -// if (EAGAIN == errno) -// { -// GNUNET_assert (dsh->synced); -// GNUNET_assert (0 == off); -// break; -// } -// GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, -// "recv"); -// do_disconnect (dsh); -// if (0 == retry_limit) -// return; /* give up */ -// if (GNUNET_OK != -// try_connect (dsh)) -// return; /* give up */ -// retry_limit--; -// continue; -// } -// if (0 == ret) -// { -// GNUNET_break (0 == off); -// return; -// } -// off += ret; -// more: -// if (off < sizeof (struct GNUNET_MessageHeader)) -// continue; -// msize = ntohs (hdr->size); -// if (off < msize) -// continue; -// switch (ntohs (hdr->type)) -// { -// case TALER_HELPER_EDDSA_MT_AVAIL: -// if (GNUNET_OK != -// handle_mt_avail (dsh, -// hdr)) -// { -// GNUNET_break_op (0); -// do_disconnect (dsh); -// return; -// } -// break; -// case TALER_HELPER_EDDSA_MT_PURGE: -// if (GNUNET_OK != -// handle_mt_purge (dsh, -// hdr)) -// { -// GNUNET_break_op (0); -// do_disconnect (dsh); -// return; -// } -// break; -// case TALER_HELPER_EDDSA_SYNCED: -// GNUNET_log (GNUNET_ERROR_TYPE_INFO, -// "Now synchronized with EdDSA helper\n"); -// dsh->synced = true; -// break; -// default: -// GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -// "Received unexpected message of type %d (len: %u)\n", -// (unsigned int) ntohs (hdr->type), -// (unsigned int) msize); -// GNUNET_break_op (0); -// do_disconnect (dsh); -// return; -// } -// memmove (buf, -// &buf[msize], -// off - msize); -// off -= msize; -// goto more; -// } -// } - - -// enum TALER_ErrorCode -// DONAU_CRYPTO_helper_esign_sign_ ( -// struct DONAU_CRYPTO_DonauSignHelper *dsh, -// const struct GNUNET_CRYPTO_EccSignaturePurpose *purpose, -// struct DONAU_DonauPublicKeyP *exchange_pub, -// struct DONAU_DonauSignatureP *exchange_sig) -// { -// uint32_t purpose_size = ntohl (purpose->size); -// -// if (GNUNET_OK != -// try_connect (dsh)) -// { -// GNUNET_log (GNUNET_ERROR_TYPE_WARNING, -// "Failed to connect to helper\n"); -// return TALER_EC_EXCHANGE_SIGNKEY_HELPER_UNAVAILABLE; -// } -// GNUNET_assert (purpose_size < -// UINT16_MAX - sizeof (struct TALER_CRYPTO_EddsaSignRequest)); -// { -// char buf[sizeof (struct TALER_CRYPTO_EddsaSignRequest) + purpose_size -// - sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose)]; -// struct TALER_CRYPTO_EddsaSignRequest *sr -// = (struct TALER_CRYPTO_EddsaSignRequest *) buf; -// -// sr->header.size = htons (sizeof (buf)); -// sr->header.type = htons (TALER_HELPER_EDDSA_MT_REQ_SIGN); -// sr->reserved = htonl (0); -// GNUNET_memcpy (&sr->purpose, -// purpose, -// purpose_size); -// if (GNUNET_OK != -// TALER_crypto_helper_send_all (dsh->sock, -// buf, -// sizeof (buf))) -// { -// GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, -// "send", -// dsh->sa.sun_path); -// do_disconnect (dsh); -// return TALER_EC_EXCHANGE_SIGNKEY_HELPER_UNAVAILABLE; -// } -// } -// -// { -// char buf[UINT16_MAX]; -// size_t off = 0; -// const struct GNUNET_MessageHeader *hdr -// = (const struct GNUNET_MessageHeader *) buf; -// bool finished = false; -// enum TALER_ErrorCode ec = TALER_EC_INVALID; -// -// while (1) -// { -// ssize_t ret; -// uint16_t msize; -// -// ret = recv (dsh->sock, -// &buf[off], -// sizeof (buf) - off, -// (finished && (0 == off)) -// ? MSG_DONTWAIT -// : 0); -// if (ret < 0) -// { -// if (EINTR == errno) -// continue; -// if (EAGAIN == errno) -// { -// GNUNET_assert (finished); -// GNUNET_assert (0 == off); -// break; -// } -// GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, -// "recv"); -// do_disconnect (dsh); -// return TALER_EC_EXCHANGE_SIGNKEY_HELPER_UNAVAILABLE; -// } -// if (0 == ret) -// { -// GNUNET_break (0 == off); -// if (finished) -// return TALER_EC_NONE; -// return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; -// } -// off += ret; -// more: -// if (off < sizeof (struct GNUNET_MessageHeader)) -// continue; -// msize = ntohs (hdr->size); -// if (off < msize) -// continue; -// switch (ntohs (hdr->type)) -// { -// case TALER_HELPER_EDDSA_MT_RES_SIGNATURE: -// if (msize != sizeof (struct TALER_CRYPTO_EddsaSignResponse)) -// { -// GNUNET_break_op (0); -// do_disconnect (dsh); -// return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; -// } -// if (finished) -// { -// GNUNET_break_op (0); -// do_disconnect (dsh); -// return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; -// } -// { -// const struct TALER_CRYPTO_EddsaSignResponse *sr = -// (const struct TALER_CRYPTO_EddsaSignResponse *) buf; -// *exchange_sig = sr->exchange_sig; -// *exchange_pub = sr->exchange_pub; -// finished = true; -// ec = TALER_EC_NONE; -// break; -// } -// case TALER_HELPER_EDDSA_MT_RES_SIGN_FAILURE: -// if (msize != sizeof (struct TALER_CRYPTO_EddsaSignFailure)) -// { -// GNUNET_break_op (0); -// do_disconnect (dsh); -// return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; -// } -// { -// const struct TALER_CRYPTO_EddsaSignFailure *sf = -// (const struct TALER_CRYPTO_EddsaSignFailure *) buf; -// -// finished = true; -// ec = (enum TALER_ErrorCode) ntohl (sf->ec); -// break; -// } -// case TALER_HELPER_EDDSA_MT_AVAIL: -// if (GNUNET_OK != -// handle_mt_avail (dsh, -// hdr)) -// { -// GNUNET_break_op (0); -// do_disconnect (dsh); -// return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; -// } -// break; /* while(1) loop ensures we recv() again */ -// case TALER_HELPER_EDDSA_MT_PURGE: -// if (GNUNET_OK != -// handle_mt_purge (dsh, -// hdr)) -// { -// GNUNET_break_op (0); -// do_disconnect (dsh); -// return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; -// } -// break; /* while(1) loop ensures we recv() again */ -// case TALER_HELPER_EDDSA_SYNCED: -// GNUNET_log (GNUNET_ERROR_TYPE_WARNING, -// "Synchronized add odd time with EdDSA helper!\n"); -// dsh->synced = true; -// break; -// default: -// GNUNET_break_op (0); -// GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -// "Received unexpected message of type %u\n", -// ntohs (hdr->type)); -// do_disconnect (dsh); -// return TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; -// } -// memmove (buf, -// &buf[msize], -// off - msize); -// off -= msize; -// goto more; -// } /* while(1) */ -// return ec; -// } -// } - - -// void -// DONAU_CRYPTO_helper_esign_revoke ( -// struct DONAU_CRYPTO_DonauSignHelper *dsh, -// const struct DONAU_DonauPublicKeyP *exchange_pub) -// { -// if (GNUNET_OK != -// try_connect (dsh)) -// return; /* give up */ -// { -// struct TALER_CRYPTO_EddsaRevokeRequest rr = { -// .header.size = htons (sizeof (rr)), -// .header.type = htons (TALER_HELPER_EDDSA_MT_REQ_REVOKE), -// .exchange_pub = *exchange_pub -// }; -// -// if (GNUNET_OK != -// TALER_crypto_helper_send_all (dsh->sock, -// &rr, -// sizeof (rr))) -// { -// GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, -// "send"); -// do_disconnect (dsh); -// return; -// } -// } -// } - - -void -DONAU_CRYPTO_helper_esign_disconnect ( - struct DONAU_CRYPTO_DonauSignHelper *dsh) -{ - if (-1 != dsh->sock) - do_disconnect (dsh); - GNUNET_free (dsh); -} - - -/* end of crypto_helper_esign.c */ diff --git a/src/util/crypto_helper_rsa.c b/src/util/crypto_helper_rsa.c @@ -1,917 +0,0 @@ -/* - This file is part of TALER - Copyright (C) 2020-2024 Taler Systems SA - - TALER is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> -*/ -/** - * @file util/crypto_helper_rsa.c - * @brief utility functions for running out-of-process private key operations - * @author Christian Grothoff - * @author Pius Loosli - */ -#include <taler/platform.h> -#include <taler/taler_util.h> -#include <taler/taler_signatures.h> -#include <taler/taler-exchange-secmod-rsa.h> -#include <poll.h> -#include <crypto_helper_common.h> -#include "donau_util.h" - -struct DONAU_CRYPTO_RsaDonationUnitHelper -{ - /** - * Function to call with updates to available key material. - */ - DONAU_CRYPTO_RsaDonationUnitKeyStatusCallback dkc; - - /** - * Closure for @e dkc - */ - void *dkc_cls; - - /** - * Socket address of the donation unitination helper process. - * Used to reconnect if the connection breaks. - */ - struct sockaddr_un sa; - - /** - * The UNIX domain socket, -1 if we are currently not connected. - */ - int sock; - - /** - * Have we ever been sync'ed? - */ - bool synced; -}; - - -/** - * Disconnect from the helper process. Updates - * @e sock field in @a dh. - * - * @param[in,out] dh handle to tear down connection of - */ -static void -do_disconnect (struct DONAU_CRYPTO_RsaDonationUnitHelper *dh) -{ - GNUNET_break (0 == close (dh->sock)); - dh->sock = -1; - dh->synced = false; -} - - -/** - * Try to connect to the helper process. Updates - * @e sock field in @a dh. - * - * @param[in,out] dh handle to establish connection for - * @return #GNUNET_OK on success - */ -static enum GNUNET_GenericReturnValue -try_connect (struct DONAU_CRYPTO_RsaDonationUnitHelper *dh) -{ - if (-1 != dh->sock) - return GNUNET_OK; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Establishing connection!\n"); - dh->sock = socket (AF_UNIX, - SOCK_STREAM, - 0); - if (-1 == dh->sock) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "socket"); - return GNUNET_SYSERR; - } - if (0 != - connect (dh->sock, - (const struct sockaddr *) &dh->sa, - sizeof (dh->sa))) - { - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, - "connect", - dh->sa.sun_path); - do_disconnect (dh); - return GNUNET_SYSERR; - } - DONAU_CRYPTO_helper_rsa_poll (dh); - return GNUNET_OK; -} - - -struct DONAU_CRYPTO_RsaDonationUnitHelper * -DONAU_CRYPTO_helper_rsa_connect ( - const struct GNUNET_CONFIGURATION_Handle *cfg, - const char *section, - DONAU_CRYPTO_RsaDonationUnitKeyStatusCallback dkc, - void *dkc_cls) -{ - struct DONAU_CRYPTO_RsaDonationUnitHelper *dh; - char *unixpath; - char *secname; - - GNUNET_asprintf (&secname, - "%s-exchange-secmod-rsa", - section); - - if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_filename (cfg, - secname, - "UNIXPATH", - &unixpath)) - { - GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, - secname, - "UNIXPATH"); - GNUNET_free (secname); - return NULL; - } - /* we use >= here because we want the sun_path to always - be 0-terminated */ - if (strlen (unixpath) >= sizeof (dh->sa.sun_path)) - { - GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR, - "taler-exchange-secmod-rsa", - "UNIXPATH", - "path too long"); - GNUNET_free (unixpath); - GNUNET_free (secname); - return NULL; - } - GNUNET_free (secname); - dh = GNUNET_new (struct DONAU_CRYPTO_RsaDonationUnitHelper); - dh->dkc = dkc; - dh->dkc_cls = dkc_cls; - dh->sa.sun_family = AF_UNIX; - strncpy (dh->sa.sun_path, - unixpath, - sizeof (dh->sa.sun_path) - 1); - GNUNET_free (unixpath); - dh->sock = -1; - if (GNUNET_OK != - try_connect (dh)) - { - DONAU_CRYPTO_helper_rsa_disconnect (dh); - return NULL; - } - return dh; -} - - -/** - * Handle a #TALER_HELPER_RSA_MT_AVAIL message from the helper. - * - * @param dh helper context - * @param hdr message that we received - * @return #GNUNET_OK on success - */ -static enum GNUNET_GenericReturnValue -handle_mt_avail (struct DONAU_CRYPTO_RsaDonationUnitHelper *dh, - const struct GNUNET_MessageHeader *hdr) -{ - const struct TALER_CRYPTO_RsaKeyAvailableNotification *kan - = (const struct TALER_CRYPTO_RsaKeyAvailableNotification *) hdr; - const char *buf = (const char *) &kan[1]; - const char *section_name; - uint16_t ps; - uint16_t snl; - - if (sizeof (*kan) > ntohs (hdr->size)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - ps = ntohs (kan->pub_size); - snl = ntohs (kan->section_name_len); - if (ntohs (hdr->size) != sizeof (*kan) + ps + snl) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - if (0 == snl) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - section_name = &buf[ps]; - if ('\0' != section_name[snl - 1]) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - - { - struct GNUNET_CRYPTO_BlindSignPublicKey *bs_pub; - struct TALER_RsaPubHashP h_rsa; - - bs_pub = GNUNET_new (struct GNUNET_CRYPTO_BlindSignPublicKey); - bs_pub->cipher = GNUNET_CRYPTO_BSA_RSA; - bs_pub->details.rsa_public_key - = GNUNET_CRYPTO_rsa_public_key_decode (buf, - ntohs (kan->pub_size)); - if (NULL == bs_pub->details.rsa_public_key) - { - GNUNET_break_op (0); - GNUNET_free (bs_pub); - return GNUNET_SYSERR; - } - bs_pub->rc = 1; - GNUNET_CRYPTO_rsa_public_key_hash (bs_pub->details.rsa_public_key, - &bs_pub->pub_key_hash); - h_rsa.hash = bs_pub->pub_key_hash; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Received RSA key %s (%s)\n", - GNUNET_h2s (&bs_pub->pub_key_hash), - section_name); - if (GNUNET_OK != - TALER_exchange_secmod_rsa_verify ( - &h_rsa, - section_name, - GNUNET_TIME_timestamp_ntoh (kan->anchor_time), - GNUNET_TIME_relative_ntoh (kan->duration_withdraw), - &kan->secm_pub, - &kan->secm_sig)) - { - GNUNET_break_op (0); - GNUNET_CRYPTO_blind_sign_pub_decref (bs_pub); - return GNUNET_SYSERR; - } - dh->dkc (dh->dkc_cls, - section_name, - GNUNET_TIME_timestamp_ntoh (kan->anchor_time), - GNUNET_TIME_relative_ntoh (kan->duration_withdraw), - &h_rsa, - bs_pub, - &kan->secm_pub, - &kan->secm_sig); - GNUNET_CRYPTO_blind_sign_pub_decref (bs_pub); - } - return GNUNET_OK; -} - - -/** - * Handle a #TALER_HELPER_RSA_MT_PURGE message from the helper. - * - * @param dh helper context - * @param hdr message that we received - * @return #GNUNET_OK on success - */ -static enum GNUNET_GenericReturnValue -handle_mt_purge (struct DONAU_CRYPTO_RsaDonationUnitHelper *dh, - const struct GNUNET_MessageHeader *hdr) -{ - const struct TALER_CRYPTO_RsaKeyPurgeNotification *pn - = (const struct TALER_CRYPTO_RsaKeyPurgeNotification *) hdr; - - if (sizeof (*pn) != ntohs (hdr->size)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Received revocation of donation unit key %s\n", - GNUNET_h2s (&pn->h_rsa.hash)); - dh->dkc (dh->dkc_cls, - NULL, - GNUNET_TIME_UNIT_ZERO_TS, - GNUNET_TIME_UNIT_ZERO, - &pn->h_rsa, - NULL, - NULL, - NULL); - return GNUNET_OK; -} - - -void -DONAU_CRYPTO_helper_rsa_poll (struct DONAU_CRYPTO_RsaDonationUnitHelper *dh) -{ - char buf[UINT16_MAX]; - size_t off = 0; - unsigned int retry_limit = 3; - const struct GNUNET_MessageHeader *hdr - = (const struct GNUNET_MessageHeader *) buf; - - if (GNUNET_OK != - try_connect (dh)) - return; /* give up */ - while (1) - { - uint16_t msize; - ssize_t ret; - - ret = recv (dh->sock, - buf + off, - sizeof (buf) - off, - (dh->synced && (0 == off)) - ? MSG_DONTWAIT - : 0); - if (ret < 0) - { - if (EINTR == errno) - continue; - if (EAGAIN == errno) - { - GNUNET_assert (dh->synced); - GNUNET_assert (0 == off); - break; - } - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "recv"); - do_disconnect (dh); - if (0 == retry_limit) - return; /* give up */ - if (GNUNET_OK != - try_connect (dh)) - return; /* give up */ - retry_limit--; - continue; - } - if (0 == ret) - { - GNUNET_break (0 == off); - return; - } - off += ret; -more: - if (off < sizeof (struct GNUNET_MessageHeader)) - continue; - msize = ntohs (hdr->size); - if (off < msize) - continue; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Received message of type %u and length %u\n", - (unsigned int) ntohs (hdr->type), - (unsigned int) msize); - switch (ntohs (hdr->type)) - { - case TALER_HELPER_RSA_MT_AVAIL: - if (GNUNET_OK != - handle_mt_avail (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return; - } - break; - case TALER_HELPER_RSA_MT_PURGE: - if (GNUNET_OK != - handle_mt_purge (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return; - } - break; - case TALER_HELPER_RSA_SYNCED: - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Now synchronized with RSA helper\n"); - dh->synced = true; - break; - default: - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Received unexpected message of type %d (len: %u)\n", - (unsigned int) ntohs (hdr->type), - (unsigned int) msize); - GNUNET_break_op (0); - do_disconnect (dh); - return; - } - memmove (buf, - &buf[msize], - off - msize); - off -= msize; - goto more; - } -} - - -enum TALER_ErrorCode -DONAU_CRYPTO_helper_rsa_sign ( - struct DONAU_CRYPTO_RsaDonationUnitHelper *dh, - const struct TALER_CRYPTO_RsaSignRequest *rsr, - struct DONAU_BlindedDonationUnitSignature *bs) -{ - enum TALER_ErrorCode ec = TALER_EC_INVALID; - - memset (bs, - 0, - sizeof (*bs)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Starting signature process\n"); - if (GNUNET_OK != - try_connect (dh)) - { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Failed to connect to helper\n"); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Requesting signature\n"); - { - char buf[sizeof (struct TALER_CRYPTO_SignRequest) + rsr->msg_size]; - struct TALER_CRYPTO_SignRequest *sr - = (struct TALER_CRYPTO_SignRequest *) buf; - - sr->header.size = htons (sizeof (buf)); - sr->header.type = htons (TALER_HELPER_RSA_MT_REQ_SIGN); - sr->reserved = htonl (0); - sr->h_rsa = *rsr->h_rsa; - GNUNET_memcpy (&sr[1], - rsr->msg, - rsr->msg_size); - if (GNUNET_OK != - TALER_crypto_helper_send_all (dh->sock, - buf, - sizeof (buf))) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "send"); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Awaiting reply\n"); - { - char buf[UINT16_MAX]; - size_t off = 0; - const struct GNUNET_MessageHeader *hdr - = (const struct GNUNET_MessageHeader *) buf; - bool finished = false; - - while (1) - { - uint16_t msize; - ssize_t ret; - - ret = recv (dh->sock, - &buf[off], - sizeof (buf) - off, - (finished && (0 == off)) - ? MSG_DONTWAIT - : 0); - if (ret < 0) - { - if (EINTR == errno) - continue; - if (EAGAIN == errno) - { - GNUNET_assert (finished); - GNUNET_assert (0 == off); - return ec; - } - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "recv"); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - break; - } - if (0 == ret) - { - GNUNET_break (0 == off); - if (! finished) - ec = TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; - return ec; - } - off += ret; -more: - if (off < sizeof (struct GNUNET_MessageHeader)) - continue; - msize = ntohs (hdr->size); - if (off < msize) - continue; - switch (ntohs (hdr->type)) - { - case TALER_HELPER_RSA_MT_RES_SIGNATURE: - if (msize < sizeof (struct TALER_CRYPTO_SignResponse)) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - if (finished) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - { - const struct TALER_CRYPTO_SignResponse *sr = - (const struct TALER_CRYPTO_SignResponse *) buf; - struct GNUNET_CRYPTO_RsaSignature *rsa_signature; - struct GNUNET_CRYPTO_BlindedSignature *blind_sig; - - rsa_signature = GNUNET_CRYPTO_rsa_signature_decode ( - &sr[1], - msize - sizeof (*sr)); - if (NULL == rsa_signature) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received signature\n"); - ec = TALER_EC_NONE; - finished = true; - blind_sig = GNUNET_new (struct GNUNET_CRYPTO_BlindedSignature); - blind_sig->cipher = GNUNET_CRYPTO_BSA_RSA; - blind_sig->rc = 1; - blind_sig->details.blinded_rsa_signature = rsa_signature; - bs->blinded_sig = blind_sig; - break; - } - case TALER_HELPER_RSA_MT_RES_SIGN_FAILURE: - if (msize != sizeof (struct TALER_CRYPTO_SignFailure)) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - { - const struct TALER_CRYPTO_SignFailure *sf = - (const struct TALER_CRYPTO_SignFailure *) buf; - - ec = (enum TALER_ErrorCode) ntohl (sf->ec); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Signing failed!\n"); - finished = true; - break; - } - case TALER_HELPER_RSA_MT_AVAIL: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received new key!\n"); - if (GNUNET_OK != - handle_mt_avail (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_RSA_MT_PURGE: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received revocation!\n"); - if (GNUNET_OK != - handle_mt_purge (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_RSA_SYNCED: - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Synchronized add odd time with RSA helper!\n"); - dh->synced = true; - break; - default: - GNUNET_break_op (0); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Received unexpected message of type %u\n", - ntohs (hdr->type)); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - goto end; - } - memmove (buf, - &buf[msize], - off - msize); - off -= msize; - goto more; - } /* while(1) */ -end: - if (finished) -// DONAU_blinded_donation_unit_sig_free(bs); - return ec; - } -} - - -enum TALER_ErrorCode -DONAU_CRYPTO_helper_rsa_batch_sign ( - struct DONAU_CRYPTO_RsaDonationUnitHelper *dh, - unsigned int rsrs_length, - const struct TALER_CRYPTO_RsaSignRequest rsrs[static rsrs_length], - struct DONAU_BlindedDonationUnitSignature bss[static rsrs_length]) -{ - enum TALER_ErrorCode ec = TALER_EC_INVALID; - unsigned int rpos; - unsigned int rend; - unsigned int wpos; - - memset (bss, - 0, - sizeof (*bss) * rsrs_length); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Starting signature process\n"); - if (GNUNET_OK != - try_connect (dh)) - { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Failed to connect to helper\n"); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Requesting %u signatures\n", - rsrs_length); - rpos = 0; - rend = 0; - wpos = 0; - while (rpos < rsrs_length) - { - unsigned int mlen = sizeof (struct TALER_CRYPTO_BatchSignRequest); - - while ( (rend < rsrs_length) && - (mlen - + sizeof (struct TALER_CRYPTO_SignRequest) - + rsrs[rend].msg_size < UINT16_MAX) ) - { - mlen += sizeof (struct TALER_CRYPTO_SignRequest) + rsrs[rend].msg_size; - rend++; - } - { - char obuf[mlen] GNUNET_ALIGN; - struct TALER_CRYPTO_BatchSignRequest *bsr - = (struct TALER_CRYPTO_BatchSignRequest *) obuf; - void *wbuf; - - bsr->header.type = htons (TALER_HELPER_RSA_MT_REQ_BATCH_SIGN); - bsr->header.size = htons (mlen); - bsr->batch_size = htonl (rend - rpos); - wbuf = &bsr[1]; - for (unsigned int i = rpos; i<rend; i++) - { - struct TALER_CRYPTO_SignRequest *sr = wbuf; - const struct TALER_CRYPTO_RsaSignRequest *rsr = &rsrs[i]; - - sr->header.type = htons (TALER_HELPER_RSA_MT_REQ_SIGN); - sr->header.size = htons (sizeof (*sr) + rsr->msg_size); - sr->reserved = htonl (0); - sr->h_rsa = *rsr->h_rsa; - GNUNET_memcpy (&sr[1], - rsr->msg, - rsr->msg_size); - wbuf += sizeof (*sr) + rsr->msg_size; - } - GNUNET_assert (wbuf == &obuf[mlen]); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending batch request [%u-%u)\n", - rpos, - rend); - if (GNUNET_OK != - TALER_crypto_helper_send_all (dh->sock, - obuf, - sizeof (obuf))) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "send"); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - } - } - rpos = rend; - { - char buf[UINT16_MAX]; - size_t off = 0; - const struct GNUNET_MessageHeader *hdr - = (const struct GNUNET_MessageHeader *) buf; - bool finished = false; - - while (1) - { - uint16_t msize; - ssize_t ret; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Awaiting reply at %u (up to %u)\n", - wpos, - rend); - ret = recv (dh->sock, - &buf[off], - sizeof (buf) - off, - (finished && (0 == off)) - ? MSG_DONTWAIT - : 0); - if (ret < 0) - { - if (EINTR == errno) - continue; - if (EAGAIN == errno) - { - GNUNET_assert (finished); - GNUNET_assert (0 == off); - break; - } - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "recv"); - do_disconnect (dh); - ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE; - break; - } - if (0 == ret) - { - GNUNET_break (0 == off); - if (! finished) - ec = TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG; - if (TALER_EC_NONE == ec) - break; - return ec; - } - off += ret; -more: - if (off < sizeof (struct GNUNET_MessageHeader)) - continue; - msize = ntohs (hdr->size); - if (off < msize) - continue; - switch (ntohs (hdr->type)) - { - case TALER_HELPER_RSA_MT_RES_SIGNATURE: - if (msize < sizeof (struct TALER_CRYPTO_SignResponse)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - if (finished) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - { - const struct TALER_CRYPTO_SignResponse *sr = - (const struct TALER_CRYPTO_SignResponse *) buf; - struct GNUNET_CRYPTO_RsaSignature *rsa_signature; - struct GNUNET_CRYPTO_BlindedSignature *blind_sig; - - rsa_signature = GNUNET_CRYPTO_rsa_signature_decode ( - &sr[1], - msize - sizeof (*sr)); - if (NULL == rsa_signature) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received %u signature\n", - wpos); - blind_sig = GNUNET_new (struct GNUNET_CRYPTO_BlindedSignature); - blind_sig->cipher = GNUNET_CRYPTO_BSA_RSA; - blind_sig->rc = 1; - blind_sig->details.blinded_rsa_signature = rsa_signature; - bss[wpos].blinded_sig = blind_sig; - wpos++; - if (wpos == rend) - { - if (TALER_EC_INVALID == ec) - ec = TALER_EC_NONE; - finished = true; - } - break; - } - case TALER_HELPER_RSA_MT_RES_SIGN_FAILURE: - if (msize != sizeof (struct TALER_CRYPTO_SignFailure)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - { - const struct TALER_CRYPTO_SignFailure *sf = - (const struct TALER_CRYPTO_SignFailure *) buf; - - ec = (enum TALER_ErrorCode) ntohl (sf->ec); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Signing %u failed with status %d!\n", - wpos, - ec); - wpos++; - if (wpos == rend) - { - finished = true; - } - break; - } - case TALER_HELPER_RSA_MT_AVAIL: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received new key!\n"); - if (GNUNET_OK != - handle_mt_avail (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_RSA_MT_PURGE: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received revocation!\n"); - if (GNUNET_OK != - handle_mt_purge (dh, - hdr)) - { - GNUNET_break_op (0); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - break; /* while(1) loop ensures we recvfrom() again */ - case TALER_HELPER_RSA_SYNCED: - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Synchronized add odd time with RSA helper!\n"); - dh->synced = true; - break; - default: - GNUNET_break_op (0); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Received unexpected message of type %u\n", - ntohs (hdr->type)); - do_disconnect (dh); - return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG; - } - memmove (buf, - &buf[msize], - off - msize); - off -= msize; - goto more; - } /* while(1) */ - } /* scope */ - } /* while (rpos < rsrs_length) */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Existing with %u signatures and status %d\n", - wpos, - ec); - return ec; -} - - -void -DONAU_CRYPTO_helper_rsa_revoke ( - struct DONAU_CRYPTO_RsaDonationUnitHelper *dh, - const struct TALER_RsaPubHashP *h_rsa) -{ - struct TALER_CRYPTO_RevokeRequest rr = { - .header.size = htons (sizeof (rr)), - .header.type = htons (TALER_HELPER_RSA_MT_REQ_REVOKE), - .h_rsa = *h_rsa - }; - - if (GNUNET_OK != - try_connect (dh)) - return; /* give up */ - if (GNUNET_OK != - TALER_crypto_helper_send_all (dh->sock, - &rr, - sizeof (rr))) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, - "send"); - do_disconnect (dh); - return; - } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Requested revocation of donation unit key %s\n", - GNUNET_h2s (&h_rsa->hash)); -} - - -void -DONAU_CRYPTO_helper_rsa_disconnect ( - struct DONAU_CRYPTO_RsaDonationUnitHelper *dh) -{ - if (-1 != dh->sock) - do_disconnect (dh); - GNUNET_free (dh); -} - - -/* end of crypto_helper_donation_unit.c */ diff --git a/src/util/donau-secmod-rsa.conf b/src/util/donau-secmod-rsa.conf @@ -0,0 +1,26 @@ +[donau-secmod-rsa] + +# How long should generated coins overlap in their validity +# periods. Should be long enough to avoid problems with +# wallets picking one key and then due to network latency +# another key being valid. The DURATION_WITHDRAW period +# must be longer than this value. +OVERLAP_DURATION = 5 m + +# Where do we store the generated private keys. +KEY_DIR = ${DONAU_DATA_HOME}donau-secmod-rsa/keys + +# Where does the helper listen for requests? +UNIXPATH = ${DONAU_RUNTIME_DIR}donau-secmod-rsa/server.sock + +# Directory for clients. +CLIENT_DIR = ${DONAU_RUNTIME_DIR}donau-secmod-rsa/clients + +# Where should the security module store its own private key? +SM_PRIV_KEY = ${DONAU_DATA_HOME}donau-secmod-rsa/secmod-private-key + +# For how long into the future do we pre-generate keys? +LOOKAHEAD_SIGN = 2 year + +# Round down anchor key start date to multiples of this time. +ANCHOR_ROUND = 1 year +\ No newline at end of file diff --git a/src/util/paths.conf b/src/util/paths.conf @@ -0,0 +1,29 @@ +# This file is in the public domain. +# +[PATHS] +# The PATHS section is special, as filenames including $-expression are +# expanded using the values from PATHS or the system environment (PATHS +# is checked first). Donau also supports expanding $-expressions using +# defaults with the syntax "${VAR:-default}". Here, "default" can again +# be a $-expression. +# +# We usually want $HOME for $DONAU_HOME, but we allow testcases to +# easily override this by setting $DONAU_TEST_HOME. +# +DONAU_HOME = ${DONAU_TEST_HOME:-${HOME:-${USERPROFILE}}} + +# see XDG Base Directory Specification at +# http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html +# for how these should be used. + +# Persistent data storage +DONAU_DATA_HOME = ${XDG_DATA_HOME:-${DONAU_HOME}/.local/share}/donau/ + +# Configuration files +DONAU_CONFIG_HOME = ${XDG_CONFIG_HOME:-${DONAU_HOME}/.config}/donau/ + +# Cached data, no big deal if lost +DONAU_CACHE_HOME = ${XDG_CACHE_HOME:-${DONAU_HOME}/.cache}/donau/ + +# Runtime data (always lost on system boot) +DONAU_RUNTIME_DIR = ${TMPDIR:-${TMP:-/tmp}}/donau-system-runtime/