LCOV - code coverage report
Current view: top level - util - crypto_helper_rsa.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 66.8 % 325 217
Test Date: 2026-05-12 15:34:29 Functions: 100.0 % 9 9

            Line data    Source code
       1              : /*
       2              :   This file is part of TALER
       3              :   Copyright (C) 2020, 2021 Taler Systems SA
       4              : 
       5              :   TALER is free software; you can redistribute it and/or modify it under the
       6              :   terms of the GNU General Public License as published by the Free Software
       7              :   Foundation; either version 3, or (at your option) any later version.
       8              : 
       9              :   TALER is distributed in the hope that it will be useful, but WITHOUT ANY
      10              :   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
      11              :   A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
      12              : 
      13              :   You should have received a copy of the GNU General Public License along with
      14              :   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
      15              : */
      16              : /**
      17              :  * @file util/crypto_helper_rsa.c
      18              :  * @brief utility functions for running out-of-process private key operations
      19              :  * @author Christian Grothoff
      20              :  */
      21              : #include "platform.h"
      22              : #include "taler/taler_util.h"
      23              : #include "taler/taler_signatures.h"
      24              : #include "crypto_helper_common.h"
      25              : #include "secmod_rsa.h"
      26              : #include <poll.h>
      27              : 
      28              : 
      29              : struct TALER_CRYPTO_RsaDenominationHelper
      30              : {
      31              :   /**
      32              :    * Function to call with updates to available key material.
      33              :    */
      34              :   TALER_CRYPTO_RsaDenominationKeyStatusCallback dkc;
      35              : 
      36              :   /**
      37              :    * Closure for @e dkc
      38              :    */
      39              :   void *dkc_cls;
      40              : 
      41              :   /**
      42              :    * Socket address of the denomination helper process.
      43              :    * Used to reconnect if the connection breaks.
      44              :    */
      45              :   struct sockaddr_un sa;
      46              : 
      47              :   /**
      48              :    * The UNIX domain socket, -1 if we are currently not connected.
      49              :    */
      50              :   int sock;
      51              : 
      52              :   /**
      53              :    * Have we ever been sync'ed?
      54              :    */
      55              :   bool synced;
      56              : };
      57              : 
      58              : 
      59              : /**
      60              :  * Disconnect from the helper process.  Updates
      61              :  * @e sock field in @a dh.
      62              :  *
      63              :  * @param[in,out] dh handle to tear down connection of
      64              :  */
      65              : static void
      66           27 : do_disconnect (struct TALER_CRYPTO_RsaDenominationHelper *dh)
      67              : {
      68           27 :   GNUNET_break (0 == close (dh->sock));
      69           27 :   dh->sock = -1;
      70           27 :   dh->synced = false;
      71           27 : }
      72              : 
      73              : 
      74              : /**
      75              :  * Try to connect to the helper process.  Updates
      76              :  * @e sock field in @a dh.
      77              :  *
      78              :  * @param[in,out] dh handle to establish connection for
      79              :  * @return #GNUNET_OK on success
      80              :  */
      81              : static enum GNUNET_GenericReturnValue
      82         1750 : try_connect (struct TALER_CRYPTO_RsaDenominationHelper *dh)
      83              : {
      84         1750 :   if (-1 != dh->sock)
      85         1723 :     return GNUNET_OK;
      86           27 :   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
      87              :               "Establishing connection!\n");
      88           27 :   dh->sock = socket (AF_UNIX,
      89              :                      SOCK_STREAM,
      90              :                      0);
      91           27 :   if (-1 == dh->sock)
      92              :   {
      93            0 :     GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
      94              :                          "socket");
      95            0 :     return GNUNET_SYSERR;
      96              :   }
      97           27 :   if (0 !=
      98           27 :       connect (dh->sock,
      99           27 :                (const struct sockaddr *) &dh->sa,
     100              :                sizeof (dh->sa)))
     101              :   {
     102            1 :     GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
     103              :                               "connect",
     104              :                               dh->sa.sun_path);
     105            1 :     do_disconnect (dh);
     106            1 :     return GNUNET_SYSERR;
     107              :   }
     108           26 :   TALER_CRYPTO_helper_rsa_poll (dh);
     109           26 :   return GNUNET_OK;
     110              : }
     111              : 
     112              : 
     113              : struct TALER_CRYPTO_RsaDenominationHelper *
     114           27 : TALER_CRYPTO_helper_rsa_connect (
     115              :   const struct GNUNET_CONFIGURATION_Handle *cfg,
     116              :   const char *section,
     117              :   TALER_CRYPTO_RsaDenominationKeyStatusCallback dkc,
     118              :   void *dkc_cls)
     119              : {
     120              :   struct TALER_CRYPTO_RsaDenominationHelper *dh;
     121              :   char *unixpath;
     122              :   char *secname;
     123              : 
     124           27 :   GNUNET_asprintf (&secname,
     125              :                    "%s-secmod-rsa",
     126              :                    section);
     127              : 
     128           27 :   if (GNUNET_OK !=
     129           27 :       GNUNET_CONFIGURATION_get_value_filename (cfg,
     130              :                                                secname,
     131              :                                                "UNIXPATH",
     132              :                                                &unixpath))
     133              :   {
     134            0 :     GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
     135              :                                secname,
     136              :                                "UNIXPATH");
     137            0 :     GNUNET_free (secname);
     138            0 :     return NULL;
     139              :   }
     140              :   /* we use >= here because we want the sun_path to always
     141              :      be 0-terminated */
     142           27 :   if (strlen (unixpath) >= sizeof (dh->sa.sun_path))
     143              :   {
     144            0 :     GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
     145              :                                secname,
     146              :                                "UNIXPATH",
     147              :                                "path too long");
     148            0 :     GNUNET_free (unixpath);
     149            0 :     GNUNET_free (secname);
     150            0 :     return NULL;
     151              :   }
     152           27 :   GNUNET_free (secname);
     153           27 :   dh = GNUNET_new (struct TALER_CRYPTO_RsaDenominationHelper);
     154           27 :   dh->dkc = dkc;
     155           27 :   dh->dkc_cls = dkc_cls;
     156           27 :   dh->sa.sun_family = AF_UNIX;
     157           27 :   strncpy (dh->sa.sun_path,
     158              :            unixpath,
     159              :            sizeof (dh->sa.sun_path) - 1);
     160           27 :   GNUNET_free (unixpath);
     161           27 :   dh->sock = -1;
     162           27 :   if (GNUNET_OK !=
     163           27 :       try_connect (dh))
     164              :   {
     165            1 :     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
     166              :                 "Could not connect to %s. Will keep trying\n",
     167              :                 "taler-exchange-helper-secmod-rsa");
     168              :   }
     169           27 :   return dh;
     170              : }
     171              : 
     172              : 
     173              : /**
     174              :  * Handle a #TALER_HELPER_RSA_MT_AVAIL message from the helper.
     175              :  *
     176              :  * @param dh helper context
     177              :  * @param hdr message that we received
     178              :  * @return #GNUNET_OK on success
     179              :  */
     180              : static enum GNUNET_GenericReturnValue
     181          331 : handle_mt_avail (struct TALER_CRYPTO_RsaDenominationHelper *dh,
     182              :                  const struct GNUNET_MessageHeader *hdr)
     183              : {
     184          331 :   const struct TALER_CRYPTO_RsaKeyAvailableNotification *kan
     185              :     = (const struct TALER_CRYPTO_RsaKeyAvailableNotification *) hdr;
     186          331 :   const char *buf = (const char *) &kan[1];
     187              :   const char *section_name;
     188              :   uint16_t ps;
     189              :   uint16_t snl;
     190              : 
     191          331 :   if (sizeof (*kan) > ntohs (hdr->size))
     192              :   {
     193            0 :     GNUNET_break_op (0);
     194            0 :     return GNUNET_SYSERR;
     195              :   }
     196          331 :   ps = ntohs (kan->pub_size);
     197          331 :   snl = ntohs (kan->section_name_len);
     198          331 :   if (ntohs (hdr->size) != sizeof (*kan) + ps + snl)
     199              :   {
     200            0 :     GNUNET_break_op (0);
     201            0 :     return GNUNET_SYSERR;
     202              :   }
     203          331 :   if (0 == snl)
     204              :   {
     205            0 :     GNUNET_break_op (0);
     206            0 :     return GNUNET_SYSERR;
     207              :   }
     208          331 :   section_name = &buf[ps];
     209          331 :   if ('\0' != section_name[snl - 1])
     210              :   {
     211            0 :     GNUNET_break_op (0);
     212            0 :     return GNUNET_SYSERR;
     213              :   }
     214              : 
     215              :   {
     216              :     struct GNUNET_CRYPTO_BlindSignPublicKey *bs_pub;
     217              :     struct TALER_RsaPubHashP h_rsa;
     218              : 
     219          331 :     bs_pub = GNUNET_new (struct GNUNET_CRYPTO_BlindSignPublicKey);
     220          331 :     bs_pub->cipher = GNUNET_CRYPTO_BSA_RSA;
     221              :     bs_pub->details.rsa_public_key
     222          662 :       = GNUNET_CRYPTO_rsa_public_key_decode (buf,
     223          331 :                                              ntohs (kan->pub_size));
     224          331 :     if (NULL == bs_pub->details.rsa_public_key)
     225              :     {
     226            0 :       GNUNET_break_op (0);
     227            0 :       GNUNET_free (bs_pub);
     228            0 :       return GNUNET_SYSERR;
     229              :     }
     230          331 :     bs_pub->rc = 1;
     231          331 :     GNUNET_CRYPTO_rsa_public_key_hash (bs_pub->details.rsa_public_key,
     232              :                                        &bs_pub->pub_key_hash);
     233          331 :     h_rsa.hash = bs_pub->pub_key_hash;
     234          331 :     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     235              :                 "Received RSA key %s (%s)\n",
     236              :                 GNUNET_h2s (&bs_pub->pub_key_hash),
     237              :                 section_name);
     238          331 :     if (GNUNET_OK !=
     239          331 :         TALER_exchange_secmod_rsa_verify (
     240              :           &h_rsa,
     241              :           section_name,
     242              :           GNUNET_TIME_timestamp_ntoh (kan->anchor_time),
     243              :           GNUNET_TIME_relative_ntoh (kan->duration_withdraw),
     244              :           &kan->secm_pub,
     245              :           &kan->secm_sig))
     246              :     {
     247            0 :       GNUNET_break_op (0);
     248            0 :       GNUNET_CRYPTO_blind_sign_pub_decref (bs_pub);
     249            0 :       return GNUNET_SYSERR;
     250              :     }
     251          331 :     dh->dkc (dh->dkc_cls,
     252              :              section_name,
     253              :              GNUNET_TIME_timestamp_ntoh (kan->anchor_time),
     254              :              GNUNET_TIME_relative_ntoh (kan->duration_withdraw),
     255              :              &h_rsa,
     256              :              bs_pub,
     257              :              &kan->secm_pub,
     258              :              &kan->secm_sig);
     259          331 :     GNUNET_CRYPTO_blind_sign_pub_decref (bs_pub);
     260              :   }
     261          331 :   return GNUNET_OK;
     262              : }
     263              : 
     264              : 
     265              : /**
     266              :  * Handle a #TALER_HELPER_RSA_MT_PURGE message from the helper.
     267              :  *
     268              :  * @param dh helper context
     269              :  * @param hdr message that we received
     270              :  * @return #GNUNET_OK on success
     271              :  */
     272              : static enum GNUNET_GenericReturnValue
     273            3 : handle_mt_purge (struct TALER_CRYPTO_RsaDenominationHelper *dh,
     274              :                  const struct GNUNET_MessageHeader *hdr)
     275              : {
     276            3 :   const struct TALER_CRYPTO_RsaKeyPurgeNotification *pn
     277              :     = (const struct TALER_CRYPTO_RsaKeyPurgeNotification *) hdr;
     278              : 
     279            3 :   if (sizeof (*pn) != ntohs (hdr->size))
     280              :   {
     281            0 :     GNUNET_break_op (0);
     282            0 :     return GNUNET_SYSERR;
     283              :   }
     284            3 :   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
     285              :               "Received revocation of denomination key %s\n",
     286              :               GNUNET_h2s (&pn->h_rsa.hash));
     287            3 :   dh->dkc (dh->dkc_cls,
     288              :            NULL,
     289            3 :            GNUNET_TIME_UNIT_ZERO_TS,
     290            3 :            GNUNET_TIME_UNIT_ZERO,
     291              :            &pn->h_rsa,
     292              :            NULL,
     293              :            NULL,
     294              :            NULL);
     295            3 :   return GNUNET_OK;
     296              : }
     297              : 
     298              : 
     299              : void
     300          738 : TALER_CRYPTO_helper_rsa_poll (struct TALER_CRYPTO_RsaDenominationHelper *dh)
     301              : {
     302              :   char buf[UINT16_MAX];
     303          738 :   size_t off = 0;
     304          738 :   unsigned int retry_limit = 3;
     305          738 :   const struct GNUNET_MessageHeader *hdr
     306              :     = (const struct GNUNET_MessageHeader *) buf;
     307              : 
     308          738 :   if (GNUNET_OK !=
     309          738 :       try_connect (dh))
     310            0 :     return; /* give up */
     311              :   while (1)
     312           32 :   {
     313              :     uint16_t msize;
     314              :     ssize_t ret;
     315              : 
     316          770 :     ret = recv (dh->sock,
     317              :                 buf + off,
     318              :                 sizeof (buf) - off,
     319          770 :                 (dh->synced && (0 == off))
     320              :                 ? MSG_DONTWAIT
     321              :                 : 0);
     322          770 :     if (ret < 0)
     323              :     {
     324          738 :       if (EINTR == errno)
     325            0 :         continue;
     326          738 :       if (EAGAIN == errno)
     327              :       {
     328          738 :         GNUNET_assert (dh->synced);
     329          738 :         GNUNET_assert (0 == off);
     330          738 :         break;
     331              :       }
     332            0 :       GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
     333              :                            "recv");
     334            0 :       do_disconnect (dh);
     335            0 :       if (0 == retry_limit)
     336            0 :         return; /* give up */
     337            0 :       if (GNUNET_OK !=
     338            0 :           try_connect (dh))
     339            0 :         return; /* give up */
     340            0 :       retry_limit--;
     341            0 :       continue;
     342              :     }
     343           32 :     if (0 == ret)
     344              :     {
     345            0 :       GNUNET_break (0 == off);
     346            0 :       return;
     347              :     }
     348           32 :     off += ret;
     349          392 : more:
     350          392 :     if (off < sizeof (struct GNUNET_MessageHeader))
     351           32 :       continue;
     352          360 :     msize = ntohs (hdr->size);
     353          360 :     if (off < msize)
     354            0 :       continue;
     355          360 :     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     356              :                 "Received message of type %u and length %u\n",
     357              :                 (unsigned int) ntohs (hdr->type),
     358              :                 (unsigned int) msize);
     359          360 :     switch (ntohs (hdr->type))
     360              :     {
     361          331 :     case TALER_HELPER_RSA_MT_AVAIL:
     362          331 :       if (GNUNET_OK !=
     363          331 :           handle_mt_avail (dh,
     364              :                            hdr))
     365              :       {
     366            0 :         GNUNET_break_op (0);
     367            0 :         do_disconnect (dh);
     368            0 :         return;
     369              :       }
     370          331 :       break;
     371            3 :     case TALER_HELPER_RSA_MT_PURGE:
     372            3 :       if (GNUNET_OK !=
     373            3 :           handle_mt_purge (dh,
     374              :                            hdr))
     375              :       {
     376            0 :         GNUNET_break_op (0);
     377            0 :         do_disconnect (dh);
     378            0 :         return;
     379              :       }
     380            3 :       break;
     381           26 :     case TALER_HELPER_RSA_SYNCED:
     382           26 :       GNUNET_log (GNUNET_ERROR_TYPE_INFO,
     383              :                   "Now synchronized with RSA helper\n");
     384           26 :       dh->synced = true;
     385           26 :       break;
     386            0 :     default:
     387            0 :       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
     388              :                   "Received unexpected message of type %d (len: %u)\n",
     389              :                   (unsigned int) ntohs (hdr->type),
     390              :                   (unsigned int) msize);
     391            0 :       GNUNET_break_op (0);
     392            0 :       do_disconnect (dh);
     393            0 :       return;
     394              :     }
     395          360 :     memmove (buf,
     396          360 :              &buf[msize],
     397              :              off - msize);
     398          360 :     off -= msize;
     399          360 :     goto more;
     400              :   }
     401              : }
     402              : 
     403              : 
     404              : enum TALER_ErrorCode
     405          982 : TALER_CRYPTO_helper_rsa_batch_sign (
     406              :   struct TALER_CRYPTO_RsaDenominationHelper *dh,
     407              :   unsigned int rsrs_length,
     408              :   const struct TALER_CRYPTO_RsaSignRequest rsrs[static rsrs_length],
     409              :   struct TALER_BlindedDenominationSignature bss[static rsrs_length])
     410          982 : {
     411          982 :   enum TALER_ErrorCode ec = TALER_EC_INVALID;
     412              :   unsigned int rpos;
     413              :   unsigned int rend;
     414              :   unsigned int wpos;
     415              : 
     416          982 :   memset (bss,
     417              :           0,
     418              :           sizeof (*bss) * rsrs_length);
     419          982 :   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     420              :               "Starting signature process\n");
     421          982 :   if (GNUNET_OK !=
     422          982 :       try_connect (dh))
     423              :   {
     424            0 :     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
     425              :                 "Failed to connect to helper\n");
     426            0 :     return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE;
     427              :   }
     428          982 :   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     429              :               "Requesting %u signatures\n",
     430              :               rsrs_length);
     431          982 :   rpos = 0;
     432          982 :   rend = 0;
     433          982 :   wpos = 0;
     434         1964 :   while (rpos < rsrs_length)
     435              :   {
     436          982 :     unsigned int mlen = sizeof (struct TALER_CRYPTO_BatchSignRequest);
     437              : 
     438         2413 :     while ( (rend < rsrs_length) &&
     439              :             (mlen
     440              :              + sizeof (struct TALER_CRYPTO_SignRequest)
     441         1431 :              + rsrs[rend].msg_size < UINT16_MAX) )
     442              :     {
     443         1431 :       mlen += sizeof (struct TALER_CRYPTO_SignRequest) + rsrs[rend].msg_size;
     444         1431 :       rend++;
     445              :     }
     446          982 :     {
     447          982 :       char obuf[mlen] GNUNET_ALIGN;
     448          982 :       struct TALER_CRYPTO_BatchSignRequest *bsr
     449              :         = (struct TALER_CRYPTO_BatchSignRequest *) obuf;
     450              :       void *wbuf;
     451              : 
     452          982 :       bsr->header.type = htons (TALER_HELPER_RSA_MT_REQ_BATCH_SIGN);
     453          982 :       bsr->header.size = htons (mlen);
     454          982 :       bsr->batch_size = htonl (rend - rpos);
     455          982 :       wbuf = &bsr[1];
     456         2413 :       for (unsigned int i = rpos; i<rend; i++)
     457              :       {
     458         1431 :         struct TALER_CRYPTO_SignRequest *sr = wbuf;
     459         1431 :         const struct TALER_CRYPTO_RsaSignRequest *rsr = &rsrs[i];
     460              : 
     461         1431 :         sr->header.type = htons (TALER_HELPER_RSA_MT_REQ_SIGN);
     462         1431 :         sr->header.size = htons (sizeof (*sr) + rsr->msg_size);
     463         1431 :         sr->reserved = htonl (0);
     464         1431 :         sr->h_rsa = *rsr->h_rsa;
     465         1431 :         GNUNET_memcpy (&sr[1],
     466              :                        rsr->msg,
     467              :                        rsr->msg_size);
     468         1431 :         wbuf += sizeof (*sr) + rsr->msg_size;
     469              :       }
     470          982 :       GNUNET_assert (wbuf == &obuf[mlen]);
     471          982 :       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     472              :                   "Sending batch request [%u-%u)\n",
     473              :                   rpos,
     474              :                   rend);
     475          982 :       if (GNUNET_OK !=
     476          982 :           TALER_crypto_helper_send_all (dh->sock,
     477              :                                         obuf,
     478          982 :                                         sizeof (obuf)))
     479              :       {
     480            0 :         GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
     481              :                              "send");
     482            0 :         do_disconnect (dh);
     483            0 :         return TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE;
     484              :       }
     485              :     }
     486          982 :     rpos = rend;
     487              :     {
     488              :       char buf[UINT16_MAX];
     489          982 :       size_t off = 0;
     490          982 :       const struct GNUNET_MessageHeader *hdr
     491              :         = (const struct GNUNET_MessageHeader *) buf;
     492          982 :       bool finished = false;
     493              : 
     494              :       while (1)
     495         1229 :       {
     496              :         uint16_t msize;
     497              :         ssize_t ret;
     498              : 
     499         2211 :         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     500              :                     "Awaiting reply at %u (up to %u)\n",
     501              :                     wpos,
     502              :                     rend);
     503         3193 :         ret = recv (dh->sock,
     504         2211 :                     &buf[off],
     505              :                     sizeof (buf) - off,
     506          982 :                     (finished && (0 == off))
     507              :                   ? MSG_DONTWAIT
     508              :                   : 0);
     509         2211 :         if (ret < 0)
     510              :         {
     511          982 :           if (EINTR == errno)
     512            0 :             continue;
     513          982 :           if (EAGAIN == errno)
     514              :           {
     515          982 :             GNUNET_assert (finished);
     516          982 :             GNUNET_assert (0 == off);
     517          982 :             break;
     518              :           }
     519            0 :           GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
     520              :                                "recv");
     521            0 :           do_disconnect (dh);
     522            0 :           ec = TALER_EC_EXCHANGE_DENOMINATION_HELPER_UNAVAILABLE;
     523            0 :           break;
     524              :         }
     525         1229 :         if (0 == ret)
     526              :         {
     527            0 :           GNUNET_break (0 == off);
     528            0 :           if (! finished)
     529            0 :             ec = TALER_EC_EXCHANGE_SIGNKEY_HELPER_BUG;
     530            0 :           if (TALER_EC_NONE == ec)
     531            0 :             break;
     532            0 :           return ec;
     533              :         }
     534         1229 :         off += ret;
     535         2660 : more:
     536         2660 :         if (off < sizeof (struct GNUNET_MessageHeader))
     537         1229 :           continue;
     538         1431 :         msize = ntohs (hdr->size);
     539         1431 :         if (off < msize)
     540            0 :           continue;
     541         1431 :         switch (ntohs (hdr->type))
     542              :         {
     543         1160 :         case TALER_HELPER_RSA_MT_RES_SIGNATURE:
     544         1160 :           if (msize < sizeof (struct TALER_CRYPTO_SignResponse))
     545              :           {
     546            0 :             GNUNET_break_op (0);
     547            0 :             do_disconnect (dh);
     548            0 :             return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
     549              :           }
     550         1160 :           if (finished)
     551              :           {
     552            0 :             GNUNET_break_op (0);
     553            0 :             do_disconnect (dh);
     554            0 :             return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
     555              :           }
     556              :           {
     557         1160 :             const struct TALER_CRYPTO_SignResponse *sr =
     558              :               (const struct TALER_CRYPTO_SignResponse *) buf;
     559              :             struct GNUNET_CRYPTO_RsaSignature *rsa_signature;
     560              :             struct GNUNET_CRYPTO_BlindedSignature *blind_sig;
     561              : 
     562         1160 :             rsa_signature = GNUNET_CRYPTO_rsa_signature_decode (
     563         1160 :               &sr[1],
     564              :               msize - sizeof (*sr));
     565         1160 :             if (NULL == rsa_signature)
     566              :             {
     567            0 :               GNUNET_break_op (0);
     568            0 :               do_disconnect (dh);
     569            0 :               return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
     570              :             }
     571         1160 :             GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     572              :                         "Received %u signature\n",
     573              :                         wpos);
     574         1160 :             blind_sig = GNUNET_new (struct GNUNET_CRYPTO_BlindedSignature);
     575         1160 :             blind_sig->cipher = GNUNET_CRYPTO_BSA_RSA;
     576         1160 :             blind_sig->rc = 1;
     577         1160 :             blind_sig->details.blinded_rsa_signature = rsa_signature;
     578         1160 :             bss[wpos].blinded_sig = blind_sig;
     579         1160 :             wpos++;
     580         1160 :             if (wpos == rend)
     581              :             {
     582          967 :               if (TALER_EC_INVALID == ec)
     583          967 :                 ec = TALER_EC_NONE;
     584          967 :               finished = true;
     585              :             }
     586         1160 :             break;
     587              :           }
     588          271 :         case TALER_HELPER_RSA_MT_RES_SIGN_FAILURE:
     589          271 :           if (msize != sizeof (struct TALER_CRYPTO_SignFailure))
     590              :           {
     591            0 :             GNUNET_break_op (0);
     592            0 :             do_disconnect (dh);
     593            0 :             return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
     594              :           }
     595              :           {
     596          271 :             const struct TALER_CRYPTO_SignFailure *sf =
     597              :               (const struct TALER_CRYPTO_SignFailure *) buf;
     598              : 
     599          271 :             ec = (enum TALER_ErrorCode) (int) ntohl (sf->ec);
     600          271 :             GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     601              :                         "Signing %u failed with status %d!\n",
     602              :                         wpos,
     603              :                         ec);
     604          271 :             wpos++;
     605          271 :             if (wpos == rend)
     606              :             {
     607           15 :               finished = true;
     608              :             }
     609          271 :             break;
     610              :           }
     611            0 :         case TALER_HELPER_RSA_MT_AVAIL:
     612            0 :           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     613              :                       "Received new key!\n");
     614            0 :           if (GNUNET_OK !=
     615            0 :               handle_mt_avail (dh,
     616              :                                hdr))
     617              :           {
     618            0 :             GNUNET_break_op (0);
     619            0 :             do_disconnect (dh);
     620            0 :             return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
     621              :           }
     622            0 :           break; /* while(1) loop ensures we recvfrom() again */
     623            0 :         case TALER_HELPER_RSA_MT_PURGE:
     624            0 :           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     625              :                       "Received revocation!\n");
     626            0 :           if (GNUNET_OK !=
     627            0 :               handle_mt_purge (dh,
     628              :                                hdr))
     629              :           {
     630            0 :             GNUNET_break_op (0);
     631            0 :             do_disconnect (dh);
     632            0 :             return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
     633              :           }
     634            0 :           break; /* while(1) loop ensures we recvfrom() again */
     635            0 :         case TALER_HELPER_RSA_SYNCED:
     636            0 :           GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
     637              :                       "Synchronized add odd time with RSA helper!\n");
     638            0 :           dh->synced = true;
     639            0 :           break;
     640            0 :         default:
     641            0 :           GNUNET_break_op (0);
     642            0 :           GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
     643              :                       "Received unexpected message of type %u\n",
     644              :                       ntohs (hdr->type));
     645            0 :           do_disconnect (dh);
     646            0 :           return TALER_EC_EXCHANGE_DENOMINATION_HELPER_BUG;
     647              :         }
     648         1431 :         memmove (buf,
     649         1431 :                  &buf[msize],
     650              :                  off - msize);
     651         1431 :         off -= msize;
     652         1431 :         goto more;
     653              :       } /* while(1) */
     654              :     } /* scope */
     655              :   }   /* while (rpos < rsrs_length) */
     656          982 :   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
     657              :               "Existing with %u signatures and status %d\n",
     658              :               wpos,
     659              :               ec);
     660          982 :   return ec;
     661              : }
     662              : 
     663              : 
     664              : void
     665            3 : TALER_CRYPTO_helper_rsa_revoke (
     666              :   struct TALER_CRYPTO_RsaDenominationHelper *dh,
     667              :   const struct TALER_RsaPubHashP *h_rsa)
     668              : {
     669            3 :   struct TALER_CRYPTO_RevokeRequest rr = {
     670            3 :     .header.size = htons (sizeof (rr)),
     671            3 :     .header.type = htons (TALER_HELPER_RSA_MT_REQ_REVOKE),
     672              :     .h_rsa = *h_rsa
     673              :   };
     674              : 
     675            3 :   if (GNUNET_OK !=
     676            3 :       try_connect (dh))
     677            0 :     return; /* give up */
     678            3 :   if (GNUNET_OK !=
     679            3 :       TALER_crypto_helper_send_all (dh->sock,
     680              :                                     &rr,
     681              :                                     sizeof (rr)))
     682              :   {
     683            0 :     GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
     684              :                          "send");
     685            0 :     do_disconnect (dh);
     686            0 :     return;
     687              :   }
     688            3 :   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
     689              :               "Requested revocation of denomination key %s\n",
     690              :               GNUNET_h2s (&h_rsa->hash));
     691              : }
     692              : 
     693              : 
     694              : void
     695           27 : TALER_CRYPTO_helper_rsa_disconnect (
     696              :   struct TALER_CRYPTO_RsaDenominationHelper *dh)
     697              : {
     698           27 :   if (-1 != dh->sock)
     699           26 :     do_disconnect (dh);
     700           27 :   GNUNET_free (dh);
     701           27 : }
     702              : 
     703              : 
     704              : /* end of crypto_helper_denom.c */
        

Generated by: LCOV version 2.0-1