LCOV - code coverage report
Current view: top level - trunnel/hs - cell_rendezvous.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 74 204 36.3 %
Date: 2021-11-24 03:28:48 Functions: 15 37 40.5 %

          Line data    Source code
       1             : /* cell_rendezvous.c -- generated by Trunnel v1.5.3.
       2             :  * https://gitweb.torproject.org/trunnel.git
       3             :  * You probably shouldn't edit this file.
       4             :  */
       5             : #include <stdlib.h>
       6             : #include "trunnel-impl.h"
       7             : 
       8             : #include "cell_rendezvous.h"
       9             : 
      10             : #define TRUNNEL_SET_ERROR_CODE(obj) \
      11             :   do {                              \
      12             :     (obj)->trunnel_error_code_ = 1; \
      13             :   } while (0)
      14             : 
      15             : #if defined(__COVERITY__) || defined(__clang_analyzer__)
      16             : /* If we're running a static analysis tool, we don't want it to complain
      17             :  * that some of our remaining-bytes checks are dead-code. */
      18             : int cellrendezvous_deadcode_dummy__ = 0;
      19             : #define OR_DEADCODE_DUMMY || cellrendezvous_deadcode_dummy__
      20             : #else
      21             : #define OR_DEADCODE_DUMMY
      22             : #endif
      23             : 
      24             : #define CHECK_REMAINING(nbytes, label)                           \
      25             :   do {                                                           \
      26             :     if (remaining < (nbytes) OR_DEADCODE_DUMMY) {                \
      27             :       goto label;                                                \
      28             :     }                                                            \
      29             :   } while (0)
      30             : 
      31             : trn_cell_rendezvous1_t *
      32           2 : trn_cell_rendezvous1_new(void)
      33             : {
      34           2 :   trn_cell_rendezvous1_t *val = trunnel_calloc(1, sizeof(trn_cell_rendezvous1_t));
      35           2 :   if (NULL == val)
      36           0 :     return NULL;
      37             :   return val;
      38             : }
      39             : 
      40             : /** Release all storage held inside 'obj', but do not free 'obj'.
      41             :  */
      42             : static void
      43           2 : trn_cell_rendezvous1_clear(trn_cell_rendezvous1_t *obj)
      44             : {
      45           2 :   (void) obj;
      46           2 :   TRUNNEL_DYNARRAY_WIPE(&obj->handshake_info);
      47           2 :   TRUNNEL_DYNARRAY_CLEAR(&obj->handshake_info);
      48           2 : }
      49             : 
      50             : void
      51           2 : trn_cell_rendezvous1_free(trn_cell_rendezvous1_t *obj)
      52             : {
      53           2 :   if (obj == NULL)
      54             :     return;
      55           2 :   trn_cell_rendezvous1_clear(obj);
      56           2 :   trunnel_memwipe(obj, sizeof(trn_cell_rendezvous1_t));
      57           2 :   trunnel_free_(obj);
      58             : }
      59             : 
      60             : size_t
      61           0 : trn_cell_rendezvous1_getlen_rendezvous_cookie(const trn_cell_rendezvous1_t *inp)
      62             : {
      63           0 :   (void)inp;  return TRUNNEL_REND_COOKIE_LEN;
      64             : }
      65             : 
      66             : uint8_t
      67           0 : trn_cell_rendezvous1_get_rendezvous_cookie(trn_cell_rendezvous1_t *inp, size_t idx)
      68             : {
      69           0 :   trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN);
      70           0 :   return inp->rendezvous_cookie[idx];
      71             : }
      72             : 
      73             : uint8_t
      74           0 : trn_cell_rendezvous1_getconst_rendezvous_cookie(const trn_cell_rendezvous1_t *inp, size_t idx)
      75             : {
      76           0 :   return trn_cell_rendezvous1_get_rendezvous_cookie((trn_cell_rendezvous1_t*)inp, idx);
      77             : }
      78             : int
      79           0 : trn_cell_rendezvous1_set_rendezvous_cookie(trn_cell_rendezvous1_t *inp, size_t idx, uint8_t elt)
      80             : {
      81           0 :   trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN);
      82           0 :   inp->rendezvous_cookie[idx] = elt;
      83           0 :   return 0;
      84             : }
      85             : 
      86             : uint8_t *
      87           2 : trn_cell_rendezvous1_getarray_rendezvous_cookie(trn_cell_rendezvous1_t *inp)
      88             : {
      89           2 :   return inp->rendezvous_cookie;
      90             : }
      91             : const uint8_t  *
      92           0 : trn_cell_rendezvous1_getconstarray_rendezvous_cookie(const trn_cell_rendezvous1_t *inp)
      93             : {
      94           0 :   return (const uint8_t  *)trn_cell_rendezvous1_getarray_rendezvous_cookie((trn_cell_rendezvous1_t*)inp);
      95             : }
      96             : size_t
      97           0 : trn_cell_rendezvous1_getlen_handshake_info(const trn_cell_rendezvous1_t *inp)
      98             : {
      99           0 :   return TRUNNEL_DYNARRAY_LEN(&inp->handshake_info);
     100             : }
     101             : 
     102             : uint8_t
     103           0 : trn_cell_rendezvous1_get_handshake_info(trn_cell_rendezvous1_t *inp, size_t idx)
     104             : {
     105           0 :   return TRUNNEL_DYNARRAY_GET(&inp->handshake_info, idx);
     106             : }
     107             : 
     108             : uint8_t
     109           0 : trn_cell_rendezvous1_getconst_handshake_info(const trn_cell_rendezvous1_t *inp, size_t idx)
     110             : {
     111           0 :   return trn_cell_rendezvous1_get_handshake_info((trn_cell_rendezvous1_t*)inp, idx);
     112             : }
     113             : int
     114           0 : trn_cell_rendezvous1_set_handshake_info(trn_cell_rendezvous1_t *inp, size_t idx, uint8_t elt)
     115             : {
     116           0 :   TRUNNEL_DYNARRAY_SET(&inp->handshake_info, idx, elt);
     117           0 :   return 0;
     118             : }
     119             : int
     120           0 : trn_cell_rendezvous1_add_handshake_info(trn_cell_rendezvous1_t *inp, uint8_t elt)
     121             : {
     122           0 :   TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->handshake_info, elt, {});
     123           0 :   return 0;
     124           0 :  trunnel_alloc_failed:
     125           0 :   TRUNNEL_SET_ERROR_CODE(inp);
     126           0 :   return -1;
     127             : }
     128             : 
     129             : uint8_t *
     130           2 : trn_cell_rendezvous1_getarray_handshake_info(trn_cell_rendezvous1_t *inp)
     131             : {
     132           2 :   return inp->handshake_info.elts_;
     133             : }
     134             : const uint8_t  *
     135           0 : trn_cell_rendezvous1_getconstarray_handshake_info(const trn_cell_rendezvous1_t *inp)
     136             : {
     137           0 :   return (const uint8_t  *)trn_cell_rendezvous1_getarray_handshake_info((trn_cell_rendezvous1_t*)inp);
     138             : }
     139             : int
     140           2 : trn_cell_rendezvous1_setlen_handshake_info(trn_cell_rendezvous1_t *inp, size_t newlen)
     141             : {
     142           2 :   uint8_t *newptr;
     143           4 :   newptr = trunnel_dynarray_setlen(&inp->handshake_info.allocated_,
     144           2 :                  &inp->handshake_info.n_, inp->handshake_info.elts_, newlen,
     145             :                  sizeof(inp->handshake_info.elts_[0]), (trunnel_free_fn_t) NULL,
     146             :                  &inp->trunnel_error_code_);
     147           2 :   if (newlen != 0 && newptr == NULL)
     148           0 :     goto trunnel_alloc_failed;
     149           2 :   inp->handshake_info.elts_ = newptr;
     150           2 :   return 0;
     151           0 :  trunnel_alloc_failed:
     152           0 :   TRUNNEL_SET_ERROR_CODE(inp);
     153           0 :   return -1;
     154             : }
     155             : const char *
     156           2 : trn_cell_rendezvous1_check(const trn_cell_rendezvous1_t *obj)
     157             : {
     158           2 :   if (obj == NULL)
     159             :     return "Object was NULL";
     160           2 :   if (obj->trunnel_error_code_)
     161           0 :     return "A set function failed on this object";
     162             :   return NULL;
     163             : }
     164             : 
     165             : ssize_t
     166           0 : trn_cell_rendezvous1_encoded_len(const trn_cell_rendezvous1_t *obj)
     167             : {
     168           0 :   ssize_t result = 0;
     169             : 
     170           0 :   if (NULL != trn_cell_rendezvous1_check(obj))
     171             :      return -1;
     172             : 
     173             : 
     174             :   /* Length of u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN] */
     175           0 :   result += TRUNNEL_REND_COOKIE_LEN;
     176             : 
     177             :   /* Length of u8 handshake_info[] */
     178           0 :   result += TRUNNEL_DYNARRAY_LEN(&obj->handshake_info);
     179           0 :   return result;
     180             : }
     181             : int
     182           0 : trn_cell_rendezvous1_clear_errors(trn_cell_rendezvous1_t *obj)
     183             : {
     184           0 :   int r = obj->trunnel_error_code_;
     185           0 :   obj->trunnel_error_code_ = 0;
     186           0 :   return r;
     187             : }
     188             : ssize_t
     189           2 : trn_cell_rendezvous1_encode(uint8_t *output, const size_t avail, const trn_cell_rendezvous1_t *obj)
     190             : {
     191           2 :   ssize_t result = 0;
     192           2 :   size_t written = 0;
     193           2 :   uint8_t *ptr = output;
     194           2 :   const char *msg;
     195             : #ifdef TRUNNEL_CHECK_ENCODED_LEN
     196             :   const ssize_t encoded_len = trn_cell_rendezvous1_encoded_len(obj);
     197             : #endif
     198             : 
     199           2 :   if (NULL != (msg = trn_cell_rendezvous1_check(obj)))
     200           0 :     goto check_failed;
     201             : 
     202             : #ifdef TRUNNEL_CHECK_ENCODED_LEN
     203             :   trunnel_assert(encoded_len >= 0);
     204             : #endif
     205             : 
     206             :   /* Encode u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN] */
     207           2 :   trunnel_assert(written <= avail);
     208           2 :   if (avail - written < TRUNNEL_REND_COOKIE_LEN)
     209           0 :     goto truncated;
     210           2 :   memcpy(ptr, obj->rendezvous_cookie, TRUNNEL_REND_COOKIE_LEN);
     211           2 :   written += TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN;
     212             : 
     213             :   /* Encode u8 handshake_info[] */
     214             :   {
     215           2 :     size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->handshake_info);
     216           2 :     trunnel_assert(written <= avail);
     217           2 :     if (avail - written < elt_len)
     218           0 :       goto truncated;
     219           2 :     if (elt_len)
     220           2 :       memcpy(ptr, obj->handshake_info.elts_, elt_len);
     221           2 :     written += elt_len; ptr += elt_len;
     222             :   }
     223             : 
     224             : 
     225           2 :   trunnel_assert(ptr == output + written);
     226             : #ifdef TRUNNEL_CHECK_ENCODED_LEN
     227             :   {
     228             :     trunnel_assert(encoded_len >= 0);
     229             :     trunnel_assert((size_t)encoded_len == written);
     230             :   }
     231             : 
     232             : #endif
     233             : 
     234           2 :   return written;
     235             : 
     236           0 :  truncated:
     237           0 :   result = -2;
     238           0 :   goto fail;
     239           0 :  check_failed:
     240           0 :   (void)msg;
     241           0 :   result = -1;
     242           0 :   goto fail;
     243             :  fail:
     244             :   trunnel_assert(result < 0);
     245             :   return result;
     246             : }
     247             : 
     248             : /** As trn_cell_rendezvous1_parse(), but do not allocate the output
     249             :  * object.
     250             :  */
     251             : static ssize_t
     252           0 : trn_cell_rendezvous1_parse_into(trn_cell_rendezvous1_t *obj, const uint8_t *input, const size_t len_in)
     253             : {
     254           0 :   const uint8_t *ptr = input;
     255           0 :   size_t remaining = len_in;
     256           0 :   ssize_t result = 0;
     257           0 :   (void)result;
     258             : 
     259             :   /* Parse u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN] */
     260           0 :   CHECK_REMAINING(TRUNNEL_REND_COOKIE_LEN, truncated);
     261           0 :   memcpy(obj->rendezvous_cookie, ptr, TRUNNEL_REND_COOKIE_LEN);
     262           0 :   remaining -= TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN;
     263             : 
     264             :   /* Parse u8 handshake_info[] */
     265           0 :   TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->handshake_info, remaining, {});
     266           0 :   obj->handshake_info.n_ = remaining;
     267           0 :   if (remaining)
     268           0 :     memcpy(obj->handshake_info.elts_, ptr, remaining);
     269           0 :   ptr += remaining; remaining -= remaining;
     270           0 :   trunnel_assert(ptr + remaining == input + len_in);
     271           0 :   return len_in - remaining;
     272             : 
     273           0 :  truncated:
     274           0 :   return -2;
     275           0 :  trunnel_alloc_failed:
     276           0 :   return -1;
     277             : }
     278             : 
     279             : ssize_t
     280           0 : trn_cell_rendezvous1_parse(trn_cell_rendezvous1_t **output, const uint8_t *input, const size_t len_in)
     281             : {
     282           0 :   ssize_t result;
     283           0 :   *output = trn_cell_rendezvous1_new();
     284           0 :   if (NULL == *output)
     285             :     return -1;
     286           0 :   result = trn_cell_rendezvous1_parse_into(*output, input, len_in);
     287           0 :   if (result < 0) {
     288           0 :     trn_cell_rendezvous1_free(*output);
     289           0 :     *output = NULL;
     290             :   }
     291             :   return result;
     292             : }
     293             : trn_cell_rendezvous2_t *
     294           1 : trn_cell_rendezvous2_new(void)
     295             : {
     296           1 :   trn_cell_rendezvous2_t *val = trunnel_calloc(1, sizeof(trn_cell_rendezvous2_t));
     297           1 :   if (NULL == val)
     298           0 :     return NULL;
     299             :   return val;
     300             : }
     301             : 
     302             : /** Release all storage held inside 'obj', but do not free 'obj'.
     303             :  */
     304             : static void
     305             : trn_cell_rendezvous2_clear(trn_cell_rendezvous2_t *obj)
     306             : {
     307             :   (void) obj;
     308             : }
     309             : 
     310             : void
     311           1 : trn_cell_rendezvous2_free(trn_cell_rendezvous2_t *obj)
     312             : {
     313           1 :   if (obj == NULL)
     314             :     return;
     315           1 :   trn_cell_rendezvous2_clear(obj);
     316           1 :   trunnel_memwipe(obj, sizeof(trn_cell_rendezvous2_t));
     317           1 :   trunnel_free_(obj);
     318             : }
     319             : 
     320             : size_t
     321           1 : trn_cell_rendezvous2_getlen_handshake_info(const trn_cell_rendezvous2_t *inp)
     322             : {
     323           1 :   (void)inp;  return TRUNNEL_HANDSHAKE_INFO_LEN;
     324             : }
     325             : 
     326             : uint8_t
     327           0 : trn_cell_rendezvous2_get_handshake_info(trn_cell_rendezvous2_t *inp, size_t idx)
     328             : {
     329           0 :   trunnel_assert(idx < TRUNNEL_HANDSHAKE_INFO_LEN);
     330           0 :   return inp->handshake_info[idx];
     331             : }
     332             : 
     333             : uint8_t
     334           0 : trn_cell_rendezvous2_getconst_handshake_info(const trn_cell_rendezvous2_t *inp, size_t idx)
     335             : {
     336           0 :   return trn_cell_rendezvous2_get_handshake_info((trn_cell_rendezvous2_t*)inp, idx);
     337             : }
     338             : int
     339           0 : trn_cell_rendezvous2_set_handshake_info(trn_cell_rendezvous2_t *inp, size_t idx, uint8_t elt)
     340             : {
     341           0 :   trunnel_assert(idx < TRUNNEL_HANDSHAKE_INFO_LEN);
     342           0 :   inp->handshake_info[idx] = elt;
     343           0 :   return 0;
     344             : }
     345             : 
     346             : uint8_t *
     347           1 : trn_cell_rendezvous2_getarray_handshake_info(trn_cell_rendezvous2_t *inp)
     348             : {
     349           1 :   return inp->handshake_info;
     350             : }
     351             : const uint8_t  *
     352           1 : trn_cell_rendezvous2_getconstarray_handshake_info(const trn_cell_rendezvous2_t *inp)
     353             : {
     354           1 :   return (const uint8_t  *)trn_cell_rendezvous2_getarray_handshake_info((trn_cell_rendezvous2_t*)inp);
     355             : }
     356             : const char *
     357           0 : trn_cell_rendezvous2_check(const trn_cell_rendezvous2_t *obj)
     358             : {
     359           0 :   if (obj == NULL)
     360             :     return "Object was NULL";
     361           0 :   if (obj->trunnel_error_code_)
     362           0 :     return "A set function failed on this object";
     363             :   return NULL;
     364             : }
     365             : 
     366             : ssize_t
     367           0 : trn_cell_rendezvous2_encoded_len(const trn_cell_rendezvous2_t *obj)
     368             : {
     369           0 :   ssize_t result = 0;
     370             : 
     371           0 :   if (NULL != trn_cell_rendezvous2_check(obj))
     372           0 :      return -1;
     373             : 
     374             : 
     375             :   /* Length of u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN] */
     376           0 :   result += TRUNNEL_HANDSHAKE_INFO_LEN;
     377             :   return result;
     378             : }
     379             : int
     380           0 : trn_cell_rendezvous2_clear_errors(trn_cell_rendezvous2_t *obj)
     381             : {
     382           0 :   int r = obj->trunnel_error_code_;
     383           0 :   obj->trunnel_error_code_ = 0;
     384           0 :   return r;
     385             : }
     386             : ssize_t
     387           0 : trn_cell_rendezvous2_encode(uint8_t *output, const size_t avail, const trn_cell_rendezvous2_t *obj)
     388             : {
     389           0 :   ssize_t result = 0;
     390           0 :   size_t written = 0;
     391           0 :   uint8_t *ptr = output;
     392           0 :   const char *msg;
     393             : #ifdef TRUNNEL_CHECK_ENCODED_LEN
     394             :   const ssize_t encoded_len = trn_cell_rendezvous2_encoded_len(obj);
     395             : #endif
     396             : 
     397           0 :   if (NULL != (msg = trn_cell_rendezvous2_check(obj)))
     398           0 :     goto check_failed;
     399             : 
     400             : #ifdef TRUNNEL_CHECK_ENCODED_LEN
     401             :   trunnel_assert(encoded_len >= 0);
     402             : #endif
     403             : 
     404             :   /* Encode u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN] */
     405           0 :   trunnel_assert(written <= avail);
     406           0 :   if (avail - written < TRUNNEL_HANDSHAKE_INFO_LEN)
     407           0 :     goto truncated;
     408           0 :   memcpy(ptr, obj->handshake_info, TRUNNEL_HANDSHAKE_INFO_LEN);
     409           0 :   written += TRUNNEL_HANDSHAKE_INFO_LEN; ptr += TRUNNEL_HANDSHAKE_INFO_LEN;
     410             : 
     411             : 
     412           0 :   trunnel_assert(ptr == output + written);
     413             : #ifdef TRUNNEL_CHECK_ENCODED_LEN
     414             :   {
     415             :     trunnel_assert(encoded_len >= 0);
     416             :     trunnel_assert((size_t)encoded_len == written);
     417             :   }
     418             : 
     419             : #endif
     420             : 
     421             :   return written;
     422             : 
     423           0 :  truncated:
     424           0 :   result = -2;
     425           0 :   goto fail;
     426           0 :  check_failed:
     427           0 :   (void)msg;
     428           0 :   result = -1;
     429           0 :   goto fail;
     430             :  fail:
     431             :   trunnel_assert(result < 0);
     432             :   return result;
     433             : }
     434             : 
     435             : /** As trn_cell_rendezvous2_parse(), but do not allocate the output
     436             :  * object.
     437             :  */
     438             : static ssize_t
     439           1 : trn_cell_rendezvous2_parse_into(trn_cell_rendezvous2_t *obj, const uint8_t *input, const size_t len_in)
     440             : {
     441           1 :   const uint8_t *ptr = input;
     442           1 :   size_t remaining = len_in;
     443           1 :   ssize_t result = 0;
     444           1 :   (void)result;
     445             : 
     446             :   /* Parse u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN] */
     447           1 :   CHECK_REMAINING(TRUNNEL_HANDSHAKE_INFO_LEN, truncated);
     448           1 :   memcpy(obj->handshake_info, ptr, TRUNNEL_HANDSHAKE_INFO_LEN);
     449           1 :   remaining -= TRUNNEL_HANDSHAKE_INFO_LEN; ptr += TRUNNEL_HANDSHAKE_INFO_LEN;
     450           1 :   trunnel_assert(ptr + remaining == input + len_in);
     451             :   return len_in - remaining;
     452             : 
     453           0 :  truncated:
     454           0 :   return -2;
     455             : }
     456             : 
     457             : ssize_t
     458           1 : trn_cell_rendezvous2_parse(trn_cell_rendezvous2_t **output, const uint8_t *input, const size_t len_in)
     459             : {
     460           1 :   ssize_t result;
     461           1 :   *output = trn_cell_rendezvous2_new();
     462           1 :   if (NULL == *output)
     463             :     return -1;
     464           1 :   result = trn_cell_rendezvous2_parse_into(*output, input, len_in);
     465           1 :   if (result < 0) {
     466           0 :     trn_cell_rendezvous2_free(*output);
     467           0 :     *output = NULL;
     468             :   }
     469             :   return result;
     470             : }

Generated by: LCOV version 1.14