From 231cdaf4f777165c3858d737f0b7b799d39758ce Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 13 Nov 2022 21:45:43 +0100 Subject: add test for batch CS derive/sign logic --- src/util/taler-exchange-secmod-cs.c | 78 ++++++++---- src/util/taler-exchange-secmod-rsa.c | 3 + src/util/test_helper_cs.c | 238 ++++++++++++++++++++++++++++++++++- 3 files changed, 290 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/util/taler-exchange-secmod-cs.c b/src/util/taler-exchange-secmod-cs.c index 13148a16c..231a8cd87 100644 --- a/src/util/taler-exchange-secmod-cs.c +++ b/src/util/taler-exchange-secmod-cs.c @@ -512,6 +512,28 @@ fail_sign (struct TES_Client *client, } +/** + * Generate error response that deriving failed. + * + * @param client client to send response to + * @param ec error code to include + * @return #GNUNET_OK on success + */ +static enum GNUNET_GenericReturnValue +fail_derive (struct TES_Client *client, + enum TALER_ErrorCode ec) +{ + struct TALER_CRYPTO_RDeriveFailure sf = { + .header.size = htons (sizeof (sf)), + .header.type = htons (TALER_HELPER_CS_MT_RES_RDERIVE_FAILURE), + .ec = htonl (ec) + }; + + return TES_transmit (client->csock, + &sf.header); +} + + /** * Generate signature response. * @@ -842,19 +864,25 @@ finish_job (struct TES_Client *client, { sem_down (&bj->sem); sem_done (&bj->sem); - if (TALER_EC_NONE != bj->ec) - { - fail_sign (client, - bj->ec); - return; - } switch (bj->type) { case TYPE_SIGN: + if (TALER_EC_NONE != bj->ec) + { + fail_sign (client, + bj->ec); + return; + } send_signature (client, &bj->details.sign.cs_answer); break; case TYPE_RDERIVE: + if (TALER_EC_NONE != bj->ec) + { + fail_derive (client, + bj->ec); + return; + } send_derivation (client, &bj->details.rderive.rpairp); break; @@ -878,16 +906,19 @@ handle_batch_sign_request (struct TES_Client *client, uint16_t size = ntohs (bsr->header.size) - sizeof (*bsr); const void *off = (const void *) &bsr[1]; unsigned int idx = 0; - struct BatchJob jobs[bs]; + struct BatchJob jobs[GNUNET_NZL (bs)]; bool failure = false; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Handling batch sign request of size %u\n", + (unsigned int) bs); if (bs > TALER_MAX_FRESH_COINS) { GNUNET_break_op (0); return GNUNET_SYSERR; } while ( (bs > 0) && - (size > sizeof (struct TALER_CRYPTO_CsSignRequestMessage)) ) + (size >= sizeof (struct TALER_CRYPTO_CsSignRequestMessage)) ) { const struct TALER_CRYPTO_CsSignRequestMessage *sr = off; uint16_t s = ntohs (sr->header.size); @@ -903,6 +934,9 @@ handle_batch_sign_request (struct TES_Client *client, off += s; size -= s; } + GNUNET_break_op (0 == size); + bs = GNUNET_MIN (bs, + idx); for (unsigned int i = 0; i TALER_MAX_FRESH_COINS) { GNUNET_break_op (0); return GNUNET_SYSERR; } while ( (bs > 0) && - (size > sizeof (struct TALER_CRYPTO_CsRDeriveRequest)) ) + (size >= sizeof (struct TALER_CRYPTO_CsRDeriveRequest)) ) { const struct TALER_CRYPTO_CsRDeriveRequest *rdr = off; uint16_t s = ntohs (rdr->header.size); @@ -964,20 +1001,17 @@ handle_batch_derive_request (struct TES_Client *client, off += s; size -= s; } + GNUNET_break_op (0 == size); + bs = GNUNET_MIN (bs, + idx); for (unsigned int i = 0; icsock, - &sf.header); + return fail_derive (client, + TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE); } return GNUNET_OK; } @@ -1219,14 +1253,8 @@ handle_r_derive_request (struct TES_Client *client, &r_pub); if (TALER_EC_NONE != ec) { - struct TALER_CRYPTO_RDeriveFailure rdf = { - .header.size = htons (sizeof (rdf)), - .header.type = htons (TALER_HELPER_CS_MT_RES_RDERIVE_FAILURE), - .ec = htonl (ec) - }; - - return TES_transmit (client->csock, - &rdf.header); + return fail_derive (client, + ec); } ret = send_derivation (client, diff --git a/src/util/taler-exchange-secmod-rsa.c b/src/util/taler-exchange-secmod-rsa.c index 779e12521..d5106c8a9 100644 --- a/src/util/taler-exchange-secmod-rsa.c +++ b/src/util/taler-exchange-secmod-rsa.c @@ -766,6 +766,9 @@ handle_batch_sign_request (struct TES_Client *client, off += s; size -= s; } + GNUNET_break_op (0 == size); + bs = GNUNET_MIN (bs, + idx); for (unsigned int i = 0; i, + GNUNET_TIME_UNIT_SECONDS)) + { + /* key worked too early */ + GNUNET_break (0); + return 4; + } + if (GNUNET_TIME_relative_cmp (GNUNET_TIME_absolute_get_duration ( + keys[k].start_time.abs_time), + >, + keys[k].validity_duration)) + { + /* key worked too later */ + GNUNET_break (0); + return 5; + } + if (check_sigs) + { + for (unsigned int i = 0; i