diff options
Diffstat (limited to 'trunnel')
| -rw-r--r-- | trunnel/README.md | 9 | ||||
| -rw-r--r-- | trunnel/stfe.c | 2796 | ||||
| -rw-r--r-- | trunnel/stfe.h | 985 | ||||
| -rw-r--r-- | trunnel/stfe.trunnel | 85 | 
4 files changed, 3875 insertions, 0 deletions
| diff --git a/trunnel/README.md b/trunnel/README.md new file mode 100644 index 0000000..74180a0 --- /dev/null +++ b/trunnel/README.md @@ -0,0 +1,9 @@ +Expressing doc/formats.md in trunnel[0]. + +- stfe.trunnel is the input file +- stfe.[ch] are output files from running trunnel on stfe.trunnel. + +TODO: Generate go code using [1]. + +[0] https://gitweb.torproject.org/trunnel.git +[1] https://github.com/mmcloughlin/trunnel diff --git a/trunnel/stfe.c b/trunnel/stfe.c new file mode 100644 index 0000000..58ecd66 --- /dev/null +++ b/trunnel/stfe.c @@ -0,0 +1,2796 @@ +/* stfe.c -- generated by Trunnel v1.5.3. + * https://gitweb.torproject.org/trunnel.git + * You probably shouldn't edit this file. + */ +#include <stdlib.h> +#include "trunnel-impl.h" + +#include "stfe.h" + +#define TRUNNEL_SET_ERROR_CODE(obj) \ +  do {                              \ +    (obj)->trunnel_error_code_ = 1; \ +  } while (0) + +#if defined(__COVERITY__) || defined(__clang_analyzer__) +/* If we're running a static analysis tool, we don't want it to complain + * that some of our remaining-bytes checks are dead-code. */ +int stfe_deadcode_dummy__ = 0; +#define OR_DEADCODE_DUMMY || stfe_deadcode_dummy__ +#else +#define OR_DEADCODE_DUMMY +#endif + +#define CHECK_REMAINING(nbytes, label)                           \ +  do {                                                           \ +    if (remaining < (nbytes) OR_DEADCODE_DUMMY) {                \ +      goto label;                                                \ +    }                                                            \ +  } while (0) + +ed25519_v1_t * +ed25519_v1_new(void) +{ +  ed25519_v1_t *val = trunnel_calloc(1, sizeof(ed25519_v1_t)); +  if (NULL == val) +    return NULL; +  val->format = T_ED25519_V1; +  return val; +} + +/** Release all storage held inside 'obj', but do not free 'obj'. + */ +static void +ed25519_v1_clear(ed25519_v1_t *obj) +{ +  (void) obj; +} + +void +ed25519_v1_free(ed25519_v1_t *obj) +{ +  if (obj == NULL) +    return; +  ed25519_v1_clear(obj); +  trunnel_memwipe(obj, sizeof(ed25519_v1_t)); +  trunnel_free_(obj); +} + +uint64_t +ed25519_v1_get_format(const ed25519_v1_t *inp) +{ +  return inp->format; +} +int +ed25519_v1_set_format(ed25519_v1_t *inp, uint64_t val) +{ +  if (! ((val == T_ED25519_V1))) { +     TRUNNEL_SET_ERROR_CODE(inp); +     return -1; +  } +  inp->format = val; +  return 0; +} +size_t +ed25519_v1_getlen_pubkey(const ed25519_v1_t *inp) +{ +  (void)inp;  return 32; +} + +uint8_t +ed25519_v1_get_pubkey(ed25519_v1_t *inp, size_t idx) +{ +  trunnel_assert(idx < 32); +  return inp->pubkey[idx]; +} + +uint8_t +ed25519_v1_getconst_pubkey(const ed25519_v1_t *inp, size_t idx) +{ +  return ed25519_v1_get_pubkey((ed25519_v1_t*)inp, idx); +} +int +ed25519_v1_set_pubkey(ed25519_v1_t *inp, size_t idx, uint8_t elt) +{ +  trunnel_assert(idx < 32); +  inp->pubkey[idx] = elt; +  return 0; +} + +uint8_t * +ed25519_v1_getarray_pubkey(ed25519_v1_t *inp) +{ +  return inp->pubkey; +} +const uint8_t  * +ed25519_v1_getconstarray_pubkey(const ed25519_v1_t *inp) +{ +  return (const uint8_t  *)ed25519_v1_getarray_pubkey((ed25519_v1_t*)inp); +} +const char * +ed25519_v1_check(const ed25519_v1_t *obj) +{ +  if (obj == NULL) +    return "Object was NULL"; +  if (obj->trunnel_error_code_) +    return "A set function failed on this object"; +  if (! (obj->format == T_ED25519_V1)) +    return "Integer out of bounds"; +  return NULL; +} + +ssize_t +ed25519_v1_encoded_len(const ed25519_v1_t *obj) +{ +  ssize_t result = 0; + +  if (NULL != ed25519_v1_check(obj)) +     return -1; + + +  /* Length of u64 format IN [T_ED25519_V1] */ +  result += 8; + +  /* Length of u8 pubkey[32] */ +  result += 32; +  return result; +} +int +ed25519_v1_clear_errors(ed25519_v1_t *obj) +{ +  int r = obj->trunnel_error_code_; +  obj->trunnel_error_code_ = 0; +  return r; +} +ssize_t +ed25519_v1_encode(uint8_t *output, const size_t avail, const ed25519_v1_t *obj) +{ +  ssize_t result = 0; +  size_t written = 0; +  uint8_t *ptr = output; +  const char *msg; +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  const ssize_t encoded_len = ed25519_v1_encoded_len(obj); +#endif + +  if (NULL != (msg = ed25519_v1_check(obj))) +    goto check_failed; + +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  trunnel_assert(encoded_len >= 0); +#endif + +  /* Encode u64 format IN [T_ED25519_V1] */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->format)); +  written += 8; ptr += 8; + +  /* Encode u8 pubkey[32] */ +  trunnel_assert(written <= avail); +  if (avail - written < 32) +    goto truncated; +  memcpy(ptr, obj->pubkey, 32); +  written += 32; ptr += 32; + + +  trunnel_assert(ptr == output + written); +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  { +    trunnel_assert(encoded_len >= 0); +    trunnel_assert((size_t)encoded_len == written); +  } + +#endif + +  return written; + + truncated: +  result = -2; +  goto fail; + check_failed: +  (void)msg; +  result = -1; +  goto fail; + fail: +  trunnel_assert(result < 0); +  return result; +} + +/** As ed25519_v1_parse(), but do not allocate the output object. + */ +static ssize_t +ed25519_v1_parse_into(ed25519_v1_t *obj, const uint8_t *input, const size_t len_in) +{ +  const uint8_t *ptr = input; +  size_t remaining = len_in; +  ssize_t result = 0; +  (void)result; + +  /* Parse u64 format IN [T_ED25519_V1] */ +  CHECK_REMAINING(8, truncated); +  obj->format = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; +  if (! (obj->format == T_ED25519_V1)) +    goto fail; + +  /* Parse u8 pubkey[32] */ +  CHECK_REMAINING(32, truncated); +  memcpy(obj->pubkey, ptr, 32); +  remaining -= 32; ptr += 32; +  trunnel_assert(ptr + remaining == input + len_in); +  return len_in - remaining; + + truncated: +  return -2; + fail: +  result = -1; +  return result; +} + +ssize_t +ed25519_v1_parse(ed25519_v1_t **output, const uint8_t *input, const size_t len_in) +{ +  ssize_t result; +  *output = ed25519_v1_new(); +  if (NULL == *output) +    return -1; +  result = ed25519_v1_parse_into(*output, input, len_in); +  if (result < 0) { +    ed25519_v1_free(*output); +    *output = NULL; +  } +  return result; +} +req_get_consistency_proof_v1_t * +req_get_consistency_proof_v1_new(void) +{ +  req_get_consistency_proof_v1_t *val = trunnel_calloc(1, sizeof(req_get_consistency_proof_v1_t)); +  if (NULL == val) +    return NULL; +  return val; +} + +/** Release all storage held inside 'obj', but do not free 'obj'. + */ +static void +req_get_consistency_proof_v1_clear(req_get_consistency_proof_v1_t *obj) +{ +  (void) obj; +} + +void +req_get_consistency_proof_v1_free(req_get_consistency_proof_v1_t *obj) +{ +  if (obj == NULL) +    return; +  req_get_consistency_proof_v1_clear(obj); +  trunnel_memwipe(obj, sizeof(req_get_consistency_proof_v1_t)); +  trunnel_free_(obj); +} + +uint64_t +req_get_consistency_proof_v1_get_old_size(const req_get_consistency_proof_v1_t *inp) +{ +  return inp->old_size; +} +int +req_get_consistency_proof_v1_set_old_size(req_get_consistency_proof_v1_t *inp, uint64_t val) +{ +  inp->old_size = val; +  return 0; +} +uint64_t +req_get_consistency_proof_v1_get_new_size(const req_get_consistency_proof_v1_t *inp) +{ +  return inp->new_size; +} +int +req_get_consistency_proof_v1_set_new_size(req_get_consistency_proof_v1_t *inp, uint64_t val) +{ +  inp->new_size = val; +  return 0; +} +const char * +req_get_consistency_proof_v1_check(const req_get_consistency_proof_v1_t *obj) +{ +  if (obj == NULL) +    return "Object was NULL"; +  if (obj->trunnel_error_code_) +    return "A set function failed on this object"; +  return NULL; +} + +ssize_t +req_get_consistency_proof_v1_encoded_len(const req_get_consistency_proof_v1_t *obj) +{ +  ssize_t result = 0; + +  if (NULL != req_get_consistency_proof_v1_check(obj)) +     return -1; + + +  /* Length of u64 old_size */ +  result += 8; + +  /* Length of u64 new_size */ +  result += 8; +  return result; +} +int +req_get_consistency_proof_v1_clear_errors(req_get_consistency_proof_v1_t *obj) +{ +  int r = obj->trunnel_error_code_; +  obj->trunnel_error_code_ = 0; +  return r; +} +ssize_t +req_get_consistency_proof_v1_encode(uint8_t *output, const size_t avail, const req_get_consistency_proof_v1_t *obj) +{ +  ssize_t result = 0; +  size_t written = 0; +  uint8_t *ptr = output; +  const char *msg; +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  const ssize_t encoded_len = req_get_consistency_proof_v1_encoded_len(obj); +#endif + +  if (NULL != (msg = req_get_consistency_proof_v1_check(obj))) +    goto check_failed; + +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  trunnel_assert(encoded_len >= 0); +#endif + +  /* Encode u64 old_size */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->old_size)); +  written += 8; ptr += 8; + +  /* Encode u64 new_size */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->new_size)); +  written += 8; ptr += 8; + + +  trunnel_assert(ptr == output + written); +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  { +    trunnel_assert(encoded_len >= 0); +    trunnel_assert((size_t)encoded_len == written); +  } + +#endif + +  return written; + + truncated: +  result = -2; +  goto fail; + check_failed: +  (void)msg; +  result = -1; +  goto fail; + fail: +  trunnel_assert(result < 0); +  return result; +} + +/** As req_get_consistency_proof_v1_parse(), but do not allocate the + * output object. + */ +static ssize_t +req_get_consistency_proof_v1_parse_into(req_get_consistency_proof_v1_t *obj, const uint8_t *input, const size_t len_in) +{ +  const uint8_t *ptr = input; +  size_t remaining = len_in; +  ssize_t result = 0; +  (void)result; + +  /* Parse u64 old_size */ +  CHECK_REMAINING(8, truncated); +  obj->old_size = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u64 new_size */ +  CHECK_REMAINING(8, truncated); +  obj->new_size = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; +  trunnel_assert(ptr + remaining == input + len_in); +  return len_in - remaining; + + truncated: +  return -2; +} + +ssize_t +req_get_consistency_proof_v1_parse(req_get_consistency_proof_v1_t **output, const uint8_t *input, const size_t len_in) +{ +  ssize_t result; +  *output = req_get_consistency_proof_v1_new(); +  if (NULL == *output) +    return -1; +  result = req_get_consistency_proof_v1_parse_into(*output, input, len_in); +  if (result < 0) { +    req_get_consistency_proof_v1_free(*output); +    *output = NULL; +  } +  return result; +} +req_get_entries_v1_t * +req_get_entries_v1_new(void) +{ +  req_get_entries_v1_t *val = trunnel_calloc(1, sizeof(req_get_entries_v1_t)); +  if (NULL == val) +    return NULL; +  return val; +} + +/** Release all storage held inside 'obj', but do not free 'obj'. + */ +static void +req_get_entries_v1_clear(req_get_entries_v1_t *obj) +{ +  (void) obj; +} + +void +req_get_entries_v1_free(req_get_entries_v1_t *obj) +{ +  if (obj == NULL) +    return; +  req_get_entries_v1_clear(obj); +  trunnel_memwipe(obj, sizeof(req_get_entries_v1_t)); +  trunnel_free_(obj); +} + +uint64_t +req_get_entries_v1_get_start_size(const req_get_entries_v1_t *inp) +{ +  return inp->start_size; +} +int +req_get_entries_v1_set_start_size(req_get_entries_v1_t *inp, uint64_t val) +{ +  inp->start_size = val; +  return 0; +} +uint64_t +req_get_entries_v1_get_end_size(const req_get_entries_v1_t *inp) +{ +  return inp->end_size; +} +int +req_get_entries_v1_set_end_size(req_get_entries_v1_t *inp, uint64_t val) +{ +  inp->end_size = val; +  return 0; +} +const char * +req_get_entries_v1_check(const req_get_entries_v1_t *obj) +{ +  if (obj == NULL) +    return "Object was NULL"; +  if (obj->trunnel_error_code_) +    return "A set function failed on this object"; +  return NULL; +} + +ssize_t +req_get_entries_v1_encoded_len(const req_get_entries_v1_t *obj) +{ +  ssize_t result = 0; + +  if (NULL != req_get_entries_v1_check(obj)) +     return -1; + + +  /* Length of u64 start_size */ +  result += 8; + +  /* Length of u64 end_size */ +  result += 8; +  return result; +} +int +req_get_entries_v1_clear_errors(req_get_entries_v1_t *obj) +{ +  int r = obj->trunnel_error_code_; +  obj->trunnel_error_code_ = 0; +  return r; +} +ssize_t +req_get_entries_v1_encode(uint8_t *output, const size_t avail, const req_get_entries_v1_t *obj) +{ +  ssize_t result = 0; +  size_t written = 0; +  uint8_t *ptr = output; +  const char *msg; +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  const ssize_t encoded_len = req_get_entries_v1_encoded_len(obj); +#endif + +  if (NULL != (msg = req_get_entries_v1_check(obj))) +    goto check_failed; + +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  trunnel_assert(encoded_len >= 0); +#endif + +  /* Encode u64 start_size */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->start_size)); +  written += 8; ptr += 8; + +  /* Encode u64 end_size */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->end_size)); +  written += 8; ptr += 8; + + +  trunnel_assert(ptr == output + written); +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  { +    trunnel_assert(encoded_len >= 0); +    trunnel_assert((size_t)encoded_len == written); +  } + +#endif + +  return written; + + truncated: +  result = -2; +  goto fail; + check_failed: +  (void)msg; +  result = -1; +  goto fail; + fail: +  trunnel_assert(result < 0); +  return result; +} + +/** As req_get_entries_v1_parse(), but do not allocate the output + * object. + */ +static ssize_t +req_get_entries_v1_parse_into(req_get_entries_v1_t *obj, const uint8_t *input, const size_t len_in) +{ +  const uint8_t *ptr = input; +  size_t remaining = len_in; +  ssize_t result = 0; +  (void)result; + +  /* Parse u64 start_size */ +  CHECK_REMAINING(8, truncated); +  obj->start_size = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u64 end_size */ +  CHECK_REMAINING(8, truncated); +  obj->end_size = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; +  trunnel_assert(ptr + remaining == input + len_in); +  return len_in - remaining; + + truncated: +  return -2; +} + +ssize_t +req_get_entries_v1_parse(req_get_entries_v1_t **output, const uint8_t *input, const size_t len_in) +{ +  ssize_t result; +  *output = req_get_entries_v1_new(); +  if (NULL == *output) +    return -1; +  result = req_get_entries_v1_parse_into(*output, input, len_in); +  if (result < 0) { +    req_get_entries_v1_free(*output); +    *output = NULL; +  } +  return result; +} +req_get_proof_by_hash_v1_t * +req_get_proof_by_hash_v1_new(void) +{ +  req_get_proof_by_hash_v1_t *val = trunnel_calloc(1, sizeof(req_get_proof_by_hash_v1_t)); +  if (NULL == val) +    return NULL; +  return val; +} + +/** Release all storage held inside 'obj', but do not free 'obj'. + */ +static void +req_get_proof_by_hash_v1_clear(req_get_proof_by_hash_v1_t *obj) +{ +  (void) obj; +} + +void +req_get_proof_by_hash_v1_free(req_get_proof_by_hash_v1_t *obj) +{ +  if (obj == NULL) +    return; +  req_get_proof_by_hash_v1_clear(obj); +  trunnel_memwipe(obj, sizeof(req_get_proof_by_hash_v1_t)); +  trunnel_free_(obj); +} + +uint64_t +req_get_proof_by_hash_v1_get_tree_size(const req_get_proof_by_hash_v1_t *inp) +{ +  return inp->tree_size; +} +int +req_get_proof_by_hash_v1_set_tree_size(req_get_proof_by_hash_v1_t *inp, uint64_t val) +{ +  inp->tree_size = val; +  return 0; +} +size_t +req_get_proof_by_hash_v1_getlen_leaf_hash(const req_get_proof_by_hash_v1_t *inp) +{ +  (void)inp;  return 32; +} + +uint8_t +req_get_proof_by_hash_v1_get_leaf_hash(req_get_proof_by_hash_v1_t *inp, size_t idx) +{ +  trunnel_assert(idx < 32); +  return inp->leaf_hash[idx]; +} + +uint8_t +req_get_proof_by_hash_v1_getconst_leaf_hash(const req_get_proof_by_hash_v1_t *inp, size_t idx) +{ +  return req_get_proof_by_hash_v1_get_leaf_hash((req_get_proof_by_hash_v1_t*)inp, idx); +} +int +req_get_proof_by_hash_v1_set_leaf_hash(req_get_proof_by_hash_v1_t *inp, size_t idx, uint8_t elt) +{ +  trunnel_assert(idx < 32); +  inp->leaf_hash[idx] = elt; +  return 0; +} + +uint8_t * +req_get_proof_by_hash_v1_getarray_leaf_hash(req_get_proof_by_hash_v1_t *inp) +{ +  return inp->leaf_hash; +} +const uint8_t  * +req_get_proof_by_hash_v1_getconstarray_leaf_hash(const req_get_proof_by_hash_v1_t *inp) +{ +  return (const uint8_t  *)req_get_proof_by_hash_v1_getarray_leaf_hash((req_get_proof_by_hash_v1_t*)inp); +} +const char * +req_get_proof_by_hash_v1_check(const req_get_proof_by_hash_v1_t *obj) +{ +  if (obj == NULL) +    return "Object was NULL"; +  if (obj->trunnel_error_code_) +    return "A set function failed on this object"; +  return NULL; +} + +ssize_t +req_get_proof_by_hash_v1_encoded_len(const req_get_proof_by_hash_v1_t *obj) +{ +  ssize_t result = 0; + +  if (NULL != req_get_proof_by_hash_v1_check(obj)) +     return -1; + + +  /* Length of u64 tree_size */ +  result += 8; + +  /* Length of u8 leaf_hash[32] */ +  result += 32; +  return result; +} +int +req_get_proof_by_hash_v1_clear_errors(req_get_proof_by_hash_v1_t *obj) +{ +  int r = obj->trunnel_error_code_; +  obj->trunnel_error_code_ = 0; +  return r; +} +ssize_t +req_get_proof_by_hash_v1_encode(uint8_t *output, const size_t avail, const req_get_proof_by_hash_v1_t *obj) +{ +  ssize_t result = 0; +  size_t written = 0; +  uint8_t *ptr = output; +  const char *msg; +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  const ssize_t encoded_len = req_get_proof_by_hash_v1_encoded_len(obj); +#endif + +  if (NULL != (msg = req_get_proof_by_hash_v1_check(obj))) +    goto check_failed; + +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  trunnel_assert(encoded_len >= 0); +#endif + +  /* Encode u64 tree_size */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->tree_size)); +  written += 8; ptr += 8; + +  /* Encode u8 leaf_hash[32] */ +  trunnel_assert(written <= avail); +  if (avail - written < 32) +    goto truncated; +  memcpy(ptr, obj->leaf_hash, 32); +  written += 32; ptr += 32; + + +  trunnel_assert(ptr == output + written); +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  { +    trunnel_assert(encoded_len >= 0); +    trunnel_assert((size_t)encoded_len == written); +  } + +#endif + +  return written; + + truncated: +  result = -2; +  goto fail; + check_failed: +  (void)msg; +  result = -1; +  goto fail; + fail: +  trunnel_assert(result < 0); +  return result; +} + +/** As req_get_proof_by_hash_v1_parse(), but do not allocate the + * output object. + */ +static ssize_t +req_get_proof_by_hash_v1_parse_into(req_get_proof_by_hash_v1_t *obj, const uint8_t *input, const size_t len_in) +{ +  const uint8_t *ptr = input; +  size_t remaining = len_in; +  ssize_t result = 0; +  (void)result; + +  /* Parse u64 tree_size */ +  CHECK_REMAINING(8, truncated); +  obj->tree_size = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u8 leaf_hash[32] */ +  CHECK_REMAINING(32, truncated); +  memcpy(obj->leaf_hash, ptr, 32); +  remaining -= 32; ptr += 32; +  trunnel_assert(ptr + remaining == input + len_in); +  return len_in - remaining; + + truncated: +  return -2; +} + +ssize_t +req_get_proof_by_hash_v1_parse(req_get_proof_by_hash_v1_t **output, const uint8_t *input, const size_t len_in) +{ +  ssize_t result; +  *output = req_get_proof_by_hash_v1_new(); +  if (NULL == *output) +    return -1; +  result = req_get_proof_by_hash_v1_parse_into(*output, input, len_in); +  if (result < 0) { +    req_get_proof_by_hash_v1_free(*output); +    *output = NULL; +  } +  return result; +} +signed_tree_head_v1_t * +signed_tree_head_v1_new(void) +{ +  signed_tree_head_v1_t *val = trunnel_calloc(1, sizeof(signed_tree_head_v1_t)); +  if (NULL == val) +    return NULL; +  val->format = T_SIGNED_TREE_HEAD_V1; +  return val; +} + +/** Release all storage held inside 'obj', but do not free 'obj'. + */ +static void +signed_tree_head_v1_clear(signed_tree_head_v1_t *obj) +{ +  (void) obj; +  TRUNNEL_DYNARRAY_WIPE(&obj->sigident); +  TRUNNEL_DYNARRAY_CLEAR(&obj->sigident); +} + +void +signed_tree_head_v1_free(signed_tree_head_v1_t *obj) +{ +  if (obj == NULL) +    return; +  signed_tree_head_v1_clear(obj); +  trunnel_memwipe(obj, sizeof(signed_tree_head_v1_t)); +  trunnel_free_(obj); +} + +uint64_t +signed_tree_head_v1_get_format(const signed_tree_head_v1_t *inp) +{ +  return inp->format; +} +int +signed_tree_head_v1_set_format(signed_tree_head_v1_t *inp, uint64_t val) +{ +  if (! ((val == T_SIGNED_TREE_HEAD_V1))) { +     TRUNNEL_SET_ERROR_CODE(inp); +     return -1; +  } +  inp->format = val; +  return 0; +} +uint64_t +signed_tree_head_v1_get_timestamp(const signed_tree_head_v1_t *inp) +{ +  return inp->timestamp; +} +int +signed_tree_head_v1_set_timestamp(signed_tree_head_v1_t *inp, uint64_t val) +{ +  inp->timestamp = val; +  return 0; +} +uint64_t +signed_tree_head_v1_get_tree_size(const signed_tree_head_v1_t *inp) +{ +  return inp->tree_size; +} +int +signed_tree_head_v1_set_tree_size(signed_tree_head_v1_t *inp, uint64_t val) +{ +  inp->tree_size = val; +  return 0; +} +size_t +signed_tree_head_v1_getlen_root_hash(const signed_tree_head_v1_t *inp) +{ +  (void)inp;  return 32; +} + +uint8_t +signed_tree_head_v1_get_root_hash(signed_tree_head_v1_t *inp, size_t idx) +{ +  trunnel_assert(idx < 32); +  return inp->root_hash[idx]; +} + +uint8_t +signed_tree_head_v1_getconst_root_hash(const signed_tree_head_v1_t *inp, size_t idx) +{ +  return signed_tree_head_v1_get_root_hash((signed_tree_head_v1_t*)inp, idx); +} +int +signed_tree_head_v1_set_root_hash(signed_tree_head_v1_t *inp, size_t idx, uint8_t elt) +{ +  trunnel_assert(idx < 32); +  inp->root_hash[idx] = elt; +  return 0; +} + +uint8_t * +signed_tree_head_v1_getarray_root_hash(signed_tree_head_v1_t *inp) +{ +  return inp->root_hash; +} +const uint8_t  * +signed_tree_head_v1_getconstarray_root_hash(const signed_tree_head_v1_t *inp) +{ +  return (const uint8_t  *)signed_tree_head_v1_getarray_root_hash((signed_tree_head_v1_t*)inp); +} +uint64_t +signed_tree_head_v1_get_length(const signed_tree_head_v1_t *inp) +{ +  return inp->length; +} +int +signed_tree_head_v1_set_length(signed_tree_head_v1_t *inp, uint64_t val) +{ +  inp->length = val; +  return 0; +} +size_t +signed_tree_head_v1_getlen_sigident(const signed_tree_head_v1_t *inp) +{ +  return TRUNNEL_DYNARRAY_LEN(&inp->sigident); +} + +uint8_t +signed_tree_head_v1_get_sigident(signed_tree_head_v1_t *inp, size_t idx) +{ +  return TRUNNEL_DYNARRAY_GET(&inp->sigident, idx); +} + +uint8_t +signed_tree_head_v1_getconst_sigident(const signed_tree_head_v1_t *inp, size_t idx) +{ +  return signed_tree_head_v1_get_sigident((signed_tree_head_v1_t*)inp, idx); +} +int +signed_tree_head_v1_set_sigident(signed_tree_head_v1_t *inp, size_t idx, uint8_t elt) +{ +  TRUNNEL_DYNARRAY_SET(&inp->sigident, idx, elt); +  return 0; +} +int +signed_tree_head_v1_add_sigident(signed_tree_head_v1_t *inp, uint8_t elt) +{ +#if SIZE_MAX >= UINT64_MAX +  if (inp->sigident.n_ == UINT64_MAX) +    goto trunnel_alloc_failed; +#endif +  TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->sigident, elt, {}); +  return 0; + trunnel_alloc_failed: +  TRUNNEL_SET_ERROR_CODE(inp); +  return -1; +} + +uint8_t * +signed_tree_head_v1_getarray_sigident(signed_tree_head_v1_t *inp) +{ +  return inp->sigident.elts_; +} +const uint8_t  * +signed_tree_head_v1_getconstarray_sigident(const signed_tree_head_v1_t *inp) +{ +  return (const uint8_t  *)signed_tree_head_v1_getarray_sigident((signed_tree_head_v1_t*)inp); +} +int +signed_tree_head_v1_setlen_sigident(signed_tree_head_v1_t *inp, size_t newlen) +{ +  uint8_t *newptr; +#if UINT64_MAX < SIZE_MAX +  if (newlen > UINT64_MAX) +    goto trunnel_alloc_failed; +#endif +  newptr = trunnel_dynarray_setlen(&inp->sigident.allocated_, +                 &inp->sigident.n_, inp->sigident.elts_, newlen, +                 sizeof(inp->sigident.elts_[0]), (trunnel_free_fn_t) NULL, +                 &inp->trunnel_error_code_); +  if (newlen != 0 && newptr == NULL) +    goto trunnel_alloc_failed; +  inp->sigident.elts_ = newptr; +  return 0; + trunnel_alloc_failed: +  TRUNNEL_SET_ERROR_CODE(inp); +  return -1; +} +const char * +signed_tree_head_v1_check(const signed_tree_head_v1_t *obj) +{ +  if (obj == NULL) +    return "Object was NULL"; +  if (obj->trunnel_error_code_) +    return "A set function failed on this object"; +  if (! (obj->format == T_SIGNED_TREE_HEAD_V1)) +    return "Integer out of bounds"; +  if (TRUNNEL_DYNARRAY_LEN(&obj->sigident) != obj->length) +    return "Length mismatch for sigident"; +  return NULL; +} + +ssize_t +signed_tree_head_v1_encoded_len(const signed_tree_head_v1_t *obj) +{ +  ssize_t result = 0; + +  if (NULL != signed_tree_head_v1_check(obj)) +     return -1; + + +  /* Length of u64 format IN [T_SIGNED_TREE_HEAD_V1] */ +  result += 8; + +  /* Length of u64 timestamp */ +  result += 8; + +  /* Length of u64 tree_size */ +  result += 8; + +  /* Length of u8 root_hash[32] */ +  result += 32; + +  /* Length of u64 length */ +  result += 8; + +  /* Length of u8 sigident[length] */ +  result += TRUNNEL_DYNARRAY_LEN(&obj->sigident); +  return result; +} +int +signed_tree_head_v1_clear_errors(signed_tree_head_v1_t *obj) +{ +  int r = obj->trunnel_error_code_; +  obj->trunnel_error_code_ = 0; +  return r; +} +ssize_t +signed_tree_head_v1_encode(uint8_t *output, const size_t avail, const signed_tree_head_v1_t *obj) +{ +  ssize_t result = 0; +  size_t written = 0; +  uint8_t *ptr = output; +  const char *msg; +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  const ssize_t encoded_len = signed_tree_head_v1_encoded_len(obj); +#endif + +  if (NULL != (msg = signed_tree_head_v1_check(obj))) +    goto check_failed; + +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  trunnel_assert(encoded_len >= 0); +#endif + +  /* Encode u64 format IN [T_SIGNED_TREE_HEAD_V1] */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->format)); +  written += 8; ptr += 8; + +  /* Encode u64 timestamp */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->timestamp)); +  written += 8; ptr += 8; + +  /* Encode u64 tree_size */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->tree_size)); +  written += 8; ptr += 8; + +  /* Encode u8 root_hash[32] */ +  trunnel_assert(written <= avail); +  if (avail - written < 32) +    goto truncated; +  memcpy(ptr, obj->root_hash, 32); +  written += 32; ptr += 32; + +  /* Encode u64 length */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->length)); +  written += 8; ptr += 8; + +  /* Encode u8 sigident[length] */ +  { +    size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->sigident); +    trunnel_assert(obj->length == elt_len); +    trunnel_assert(written <= avail); +    if (avail - written < elt_len) +      goto truncated; +    if (elt_len) +      memcpy(ptr, obj->sigident.elts_, elt_len); +    written += elt_len; ptr += elt_len; +  } + + +  trunnel_assert(ptr == output + written); +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  { +    trunnel_assert(encoded_len >= 0); +    trunnel_assert((size_t)encoded_len == written); +  } + +#endif + +  return written; + + truncated: +  result = -2; +  goto fail; + check_failed: +  (void)msg; +  result = -1; +  goto fail; + fail: +  trunnel_assert(result < 0); +  return result; +} + +/** As signed_tree_head_v1_parse(), but do not allocate the output + * object. + */ +static ssize_t +signed_tree_head_v1_parse_into(signed_tree_head_v1_t *obj, const uint8_t *input, const size_t len_in) +{ +  const uint8_t *ptr = input; +  size_t remaining = len_in; +  ssize_t result = 0; +  (void)result; + +  /* Parse u64 format IN [T_SIGNED_TREE_HEAD_V1] */ +  CHECK_REMAINING(8, truncated); +  obj->format = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; +  if (! (obj->format == T_SIGNED_TREE_HEAD_V1)) +    goto fail; + +  /* Parse u64 timestamp */ +  CHECK_REMAINING(8, truncated); +  obj->timestamp = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u64 tree_size */ +  CHECK_REMAINING(8, truncated); +  obj->tree_size = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u8 root_hash[32] */ +  CHECK_REMAINING(32, truncated); +  memcpy(obj->root_hash, ptr, 32); +  remaining -= 32; ptr += 32; + +  /* Parse u64 length */ +  CHECK_REMAINING(8, truncated); +  obj->length = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u8 sigident[length] */ +  CHECK_REMAINING(obj->length, truncated); +  TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->sigident, obj->length, {}); +  obj->sigident.n_ = obj->length; +  if (obj->length) +    memcpy(obj->sigident.elts_, ptr, obj->length); +  ptr += obj->length; remaining -= obj->length; +  trunnel_assert(ptr + remaining == input + len_in); +  return len_in - remaining; + + truncated: +  return -2; + trunnel_alloc_failed: +  return -1; + fail: +  result = -1; +  return result; +} + +ssize_t +signed_tree_head_v1_parse(signed_tree_head_v1_t **output, const uint8_t *input, const size_t len_in) +{ +  ssize_t result; +  *output = signed_tree_head_v1_new(); +  if (NULL == *output) +    return -1; +  result = signed_tree_head_v1_parse_into(*output, input, len_in); +  if (result < 0) { +    signed_tree_head_v1_free(*output); +    *output = NULL; +  } +  return result; +} +consistency_proof_v1_t * +consistency_proof_v1_new(void) +{ +  consistency_proof_v1_t *val = trunnel_calloc(1, sizeof(consistency_proof_v1_t)); +  if (NULL == val) +    return NULL; +  val->format = T_CONSISTENCY_PROOF_V1; +  return val; +} + +/** Release all storage held inside 'obj', but do not free 'obj'. + */ +static void +consistency_proof_v1_clear(consistency_proof_v1_t *obj) +{ +  (void) obj; +  ed25519_v1_free(obj->identifier); +  obj->identifier = NULL; +  TRUNNEL_DYNARRAY_WIPE(&obj->hashes); +  TRUNNEL_DYNARRAY_CLEAR(&obj->hashes); +} + +void +consistency_proof_v1_free(consistency_proof_v1_t *obj) +{ +  if (obj == NULL) +    return; +  consistency_proof_v1_clear(obj); +  trunnel_memwipe(obj, sizeof(consistency_proof_v1_t)); +  trunnel_free_(obj); +} + +uint64_t +consistency_proof_v1_get_format(const consistency_proof_v1_t *inp) +{ +  return inp->format; +} +int +consistency_proof_v1_set_format(consistency_proof_v1_t *inp, uint64_t val) +{ +  if (! ((val == T_CONSISTENCY_PROOF_V1))) { +     TRUNNEL_SET_ERROR_CODE(inp); +     return -1; +  } +  inp->format = val; +  return 0; +} +struct ed25519_v1_st * +consistency_proof_v1_get_identifier(consistency_proof_v1_t *inp) +{ +  return inp->identifier; +} +const struct ed25519_v1_st * +consistency_proof_v1_getconst_identifier(const consistency_proof_v1_t *inp) +{ +  return consistency_proof_v1_get_identifier((consistency_proof_v1_t*) inp); +} +int +consistency_proof_v1_set_identifier(consistency_proof_v1_t *inp, struct ed25519_v1_st *val) +{ +  if (inp->identifier && inp->identifier != val) +    ed25519_v1_free(inp->identifier); +  return consistency_proof_v1_set0_identifier(inp, val); +} +int +consistency_proof_v1_set0_identifier(consistency_proof_v1_t *inp, struct ed25519_v1_st *val) +{ +  inp->identifier = val; +  return 0; +} +uint64_t +consistency_proof_v1_get_old_size(const consistency_proof_v1_t *inp) +{ +  return inp->old_size; +} +int +consistency_proof_v1_set_old_size(consistency_proof_v1_t *inp, uint64_t val) +{ +  inp->old_size = val; +  return 0; +} +uint64_t +consistency_proof_v1_get_new_size(const consistency_proof_v1_t *inp) +{ +  return inp->new_size; +} +int +consistency_proof_v1_set_new_size(consistency_proof_v1_t *inp, uint64_t val) +{ +  inp->new_size = val; +  return 0; +} +uint64_t +consistency_proof_v1_get_length(const consistency_proof_v1_t *inp) +{ +  return inp->length; +} +int +consistency_proof_v1_set_length(consistency_proof_v1_t *inp, uint64_t val) +{ +  inp->length = val; +  return 0; +} +size_t +consistency_proof_v1_getlen_hashes(const consistency_proof_v1_t *inp) +{ +  return TRUNNEL_DYNARRAY_LEN(&inp->hashes); +} + +uint8_t +consistency_proof_v1_get_hashes(consistency_proof_v1_t *inp, size_t idx) +{ +  return TRUNNEL_DYNARRAY_GET(&inp->hashes, idx); +} + +uint8_t +consistency_proof_v1_getconst_hashes(const consistency_proof_v1_t *inp, size_t idx) +{ +  return consistency_proof_v1_get_hashes((consistency_proof_v1_t*)inp, idx); +} +int +consistency_proof_v1_set_hashes(consistency_proof_v1_t *inp, size_t idx, uint8_t elt) +{ +  TRUNNEL_DYNARRAY_SET(&inp->hashes, idx, elt); +  return 0; +} +int +consistency_proof_v1_add_hashes(consistency_proof_v1_t *inp, uint8_t elt) +{ +#if SIZE_MAX >= UINT64_MAX +  if (inp->hashes.n_ == UINT64_MAX) +    goto trunnel_alloc_failed; +#endif +  TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->hashes, elt, {}); +  return 0; + trunnel_alloc_failed: +  TRUNNEL_SET_ERROR_CODE(inp); +  return -1; +} + +uint8_t * +consistency_proof_v1_getarray_hashes(consistency_proof_v1_t *inp) +{ +  return inp->hashes.elts_; +} +const uint8_t  * +consistency_proof_v1_getconstarray_hashes(const consistency_proof_v1_t *inp) +{ +  return (const uint8_t  *)consistency_proof_v1_getarray_hashes((consistency_proof_v1_t*)inp); +} +int +consistency_proof_v1_setlen_hashes(consistency_proof_v1_t *inp, size_t newlen) +{ +  uint8_t *newptr; +#if UINT64_MAX < SIZE_MAX +  if (newlen > UINT64_MAX) +    goto trunnel_alloc_failed; +#endif +  newptr = trunnel_dynarray_setlen(&inp->hashes.allocated_, +                 &inp->hashes.n_, inp->hashes.elts_, newlen, +                 sizeof(inp->hashes.elts_[0]), (trunnel_free_fn_t) NULL, +                 &inp->trunnel_error_code_); +  if (newlen != 0 && newptr == NULL) +    goto trunnel_alloc_failed; +  inp->hashes.elts_ = newptr; +  return 0; + trunnel_alloc_failed: +  TRUNNEL_SET_ERROR_CODE(inp); +  return -1; +} +const char * +consistency_proof_v1_check(const consistency_proof_v1_t *obj) +{ +  if (obj == NULL) +    return "Object was NULL"; +  if (obj->trunnel_error_code_) +    return "A set function failed on this object"; +  if (! (obj->format == T_CONSISTENCY_PROOF_V1)) +    return "Integer out of bounds"; +  { +    const char *msg; +    if (NULL != (msg = ed25519_v1_check(obj->identifier))) +      return msg; +  } +  if (TRUNNEL_DYNARRAY_LEN(&obj->hashes) != obj->length) +    return "Length mismatch for hashes"; +  return NULL; +} + +ssize_t +consistency_proof_v1_encoded_len(const consistency_proof_v1_t *obj) +{ +  ssize_t result = 0; + +  if (NULL != consistency_proof_v1_check(obj)) +     return -1; + + +  /* Length of u64 format IN [T_CONSISTENCY_PROOF_V1] */ +  result += 8; + +  /* Length of struct ed25519_v1 identifier */ +  result += ed25519_v1_encoded_len(obj->identifier); + +  /* Length of u64 old_size */ +  result += 8; + +  /* Length of u64 new_size */ +  result += 8; + +  /* Length of u64 length */ +  result += 8; + +  /* Length of u8 hashes[length] */ +  result += TRUNNEL_DYNARRAY_LEN(&obj->hashes); +  return result; +} +int +consistency_proof_v1_clear_errors(consistency_proof_v1_t *obj) +{ +  int r = obj->trunnel_error_code_; +  obj->trunnel_error_code_ = 0; +  return r; +} +ssize_t +consistency_proof_v1_encode(uint8_t *output, const size_t avail, const consistency_proof_v1_t *obj) +{ +  ssize_t result = 0; +  size_t written = 0; +  uint8_t *ptr = output; +  const char *msg; +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  const ssize_t encoded_len = consistency_proof_v1_encoded_len(obj); +#endif + +  if (NULL != (msg = consistency_proof_v1_check(obj))) +    goto check_failed; + +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  trunnel_assert(encoded_len >= 0); +#endif + +  /* Encode u64 format IN [T_CONSISTENCY_PROOF_V1] */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->format)); +  written += 8; ptr += 8; + +  /* Encode struct ed25519_v1 identifier */ +  trunnel_assert(written <= avail); +  result = ed25519_v1_encode(ptr, avail - written, obj->identifier); +  if (result < 0) +    goto fail; /* XXXXXXX !*/ +  written += result; ptr += result; + +  /* Encode u64 old_size */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->old_size)); +  written += 8; ptr += 8; + +  /* Encode u64 new_size */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->new_size)); +  written += 8; ptr += 8; + +  /* Encode u64 length */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->length)); +  written += 8; ptr += 8; + +  /* Encode u8 hashes[length] */ +  { +    size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->hashes); +    trunnel_assert(obj->length == elt_len); +    trunnel_assert(written <= avail); +    if (avail - written < elt_len) +      goto truncated; +    if (elt_len) +      memcpy(ptr, obj->hashes.elts_, elt_len); +    written += elt_len; ptr += elt_len; +  } + + +  trunnel_assert(ptr == output + written); +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  { +    trunnel_assert(encoded_len >= 0); +    trunnel_assert((size_t)encoded_len == written); +  } + +#endif + +  return written; + + truncated: +  result = -2; +  goto fail; + check_failed: +  (void)msg; +  result = -1; +  goto fail; + fail: +  trunnel_assert(result < 0); +  return result; +} + +/** As consistency_proof_v1_parse(), but do not allocate the output + * object. + */ +static ssize_t +consistency_proof_v1_parse_into(consistency_proof_v1_t *obj, const uint8_t *input, const size_t len_in) +{ +  const uint8_t *ptr = input; +  size_t remaining = len_in; +  ssize_t result = 0; +  (void)result; + +  /* Parse u64 format IN [T_CONSISTENCY_PROOF_V1] */ +  CHECK_REMAINING(8, truncated); +  obj->format = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; +  if (! (obj->format == T_CONSISTENCY_PROOF_V1)) +    goto fail; + +  /* Parse struct ed25519_v1 identifier */ +  result = ed25519_v1_parse(&obj->identifier, ptr, remaining); +  if (result < 0) +    goto relay_fail; +  trunnel_assert((size_t)result <= remaining); +  remaining -= result; ptr += result; + +  /* Parse u64 old_size */ +  CHECK_REMAINING(8, truncated); +  obj->old_size = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u64 new_size */ +  CHECK_REMAINING(8, truncated); +  obj->new_size = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u64 length */ +  CHECK_REMAINING(8, truncated); +  obj->length = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u8 hashes[length] */ +  CHECK_REMAINING(obj->length, truncated); +  TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->hashes, obj->length, {}); +  obj->hashes.n_ = obj->length; +  if (obj->length) +    memcpy(obj->hashes.elts_, ptr, obj->length); +  ptr += obj->length; remaining -= obj->length; +  trunnel_assert(ptr + remaining == input + len_in); +  return len_in - remaining; + + truncated: +  return -2; + relay_fail: +  trunnel_assert(result < 0); +  return result; + trunnel_alloc_failed: +  return -1; + fail: +  result = -1; +  return result; +} + +ssize_t +consistency_proof_v1_parse(consistency_proof_v1_t **output, const uint8_t *input, const size_t len_in) +{ +  ssize_t result; +  *output = consistency_proof_v1_new(); +  if (NULL == *output) +    return -1; +  result = consistency_proof_v1_parse_into(*output, input, len_in); +  if (result < 0) { +    consistency_proof_v1_free(*output); +    *output = NULL; +  } +  return result; +} +inclusion_proof_v1_t * +inclusion_proof_v1_new(void) +{ +  inclusion_proof_v1_t *val = trunnel_calloc(1, sizeof(inclusion_proof_v1_t)); +  if (NULL == val) +    return NULL; +  val->format = T_INCLUSION_PROOF_V1; +  return val; +} + +/** Release all storage held inside 'obj', but do not free 'obj'. + */ +static void +inclusion_proof_v1_clear(inclusion_proof_v1_t *obj) +{ +  (void) obj; +  ed25519_v1_free(obj->identifier); +  obj->identifier = NULL; +  TRUNNEL_DYNARRAY_WIPE(&obj->hashes); +  TRUNNEL_DYNARRAY_CLEAR(&obj->hashes); +} + +void +inclusion_proof_v1_free(inclusion_proof_v1_t *obj) +{ +  if (obj == NULL) +    return; +  inclusion_proof_v1_clear(obj); +  trunnel_memwipe(obj, sizeof(inclusion_proof_v1_t)); +  trunnel_free_(obj); +} + +uint64_t +inclusion_proof_v1_get_format(const inclusion_proof_v1_t *inp) +{ +  return inp->format; +} +int +inclusion_proof_v1_set_format(inclusion_proof_v1_t *inp, uint64_t val) +{ +  if (! ((val == T_INCLUSION_PROOF_V1))) { +     TRUNNEL_SET_ERROR_CODE(inp); +     return -1; +  } +  inp->format = val; +  return 0; +} +struct ed25519_v1_st * +inclusion_proof_v1_get_identifier(inclusion_proof_v1_t *inp) +{ +  return inp->identifier; +} +const struct ed25519_v1_st * +inclusion_proof_v1_getconst_identifier(const inclusion_proof_v1_t *inp) +{ +  return inclusion_proof_v1_get_identifier((inclusion_proof_v1_t*) inp); +} +int +inclusion_proof_v1_set_identifier(inclusion_proof_v1_t *inp, struct ed25519_v1_st *val) +{ +  if (inp->identifier && inp->identifier != val) +    ed25519_v1_free(inp->identifier); +  return inclusion_proof_v1_set0_identifier(inp, val); +} +int +inclusion_proof_v1_set0_identifier(inclusion_proof_v1_t *inp, struct ed25519_v1_st *val) +{ +  inp->identifier = val; +  return 0; +} +uint64_t +inclusion_proof_v1_get_tree_size(const inclusion_proof_v1_t *inp) +{ +  return inp->tree_size; +} +int +inclusion_proof_v1_set_tree_size(inclusion_proof_v1_t *inp, uint64_t val) +{ +  inp->tree_size = val; +  return 0; +} +uint64_t +inclusion_proof_v1_get_leaf_index(const inclusion_proof_v1_t *inp) +{ +  return inp->leaf_index; +} +int +inclusion_proof_v1_set_leaf_index(inclusion_proof_v1_t *inp, uint64_t val) +{ +  inp->leaf_index = val; +  return 0; +} +uint64_t +inclusion_proof_v1_get_length(const inclusion_proof_v1_t *inp) +{ +  return inp->length; +} +int +inclusion_proof_v1_set_length(inclusion_proof_v1_t *inp, uint64_t val) +{ +  inp->length = val; +  return 0; +} +size_t +inclusion_proof_v1_getlen_hashes(const inclusion_proof_v1_t *inp) +{ +  return TRUNNEL_DYNARRAY_LEN(&inp->hashes); +} + +uint8_t +inclusion_proof_v1_get_hashes(inclusion_proof_v1_t *inp, size_t idx) +{ +  return TRUNNEL_DYNARRAY_GET(&inp->hashes, idx); +} + +uint8_t +inclusion_proof_v1_getconst_hashes(const inclusion_proof_v1_t *inp, size_t idx) +{ +  return inclusion_proof_v1_get_hashes((inclusion_proof_v1_t*)inp, idx); +} +int +inclusion_proof_v1_set_hashes(inclusion_proof_v1_t *inp, size_t idx, uint8_t elt) +{ +  TRUNNEL_DYNARRAY_SET(&inp->hashes, idx, elt); +  return 0; +} +int +inclusion_proof_v1_add_hashes(inclusion_proof_v1_t *inp, uint8_t elt) +{ +#if SIZE_MAX >= UINT64_MAX +  if (inp->hashes.n_ == UINT64_MAX) +    goto trunnel_alloc_failed; +#endif +  TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->hashes, elt, {}); +  return 0; + trunnel_alloc_failed: +  TRUNNEL_SET_ERROR_CODE(inp); +  return -1; +} + +uint8_t * +inclusion_proof_v1_getarray_hashes(inclusion_proof_v1_t *inp) +{ +  return inp->hashes.elts_; +} +const uint8_t  * +inclusion_proof_v1_getconstarray_hashes(const inclusion_proof_v1_t *inp) +{ +  return (const uint8_t  *)inclusion_proof_v1_getarray_hashes((inclusion_proof_v1_t*)inp); +} +int +inclusion_proof_v1_setlen_hashes(inclusion_proof_v1_t *inp, size_t newlen) +{ +  uint8_t *newptr; +#if UINT64_MAX < SIZE_MAX +  if (newlen > UINT64_MAX) +    goto trunnel_alloc_failed; +#endif +  newptr = trunnel_dynarray_setlen(&inp->hashes.allocated_, +                 &inp->hashes.n_, inp->hashes.elts_, newlen, +                 sizeof(inp->hashes.elts_[0]), (trunnel_free_fn_t) NULL, +                 &inp->trunnel_error_code_); +  if (newlen != 0 && newptr == NULL) +    goto trunnel_alloc_failed; +  inp->hashes.elts_ = newptr; +  return 0; + trunnel_alloc_failed: +  TRUNNEL_SET_ERROR_CODE(inp); +  return -1; +} +const char * +inclusion_proof_v1_check(const inclusion_proof_v1_t *obj) +{ +  if (obj == NULL) +    return "Object was NULL"; +  if (obj->trunnel_error_code_) +    return "A set function failed on this object"; +  if (! (obj->format == T_INCLUSION_PROOF_V1)) +    return "Integer out of bounds"; +  { +    const char *msg; +    if (NULL != (msg = ed25519_v1_check(obj->identifier))) +      return msg; +  } +  if (TRUNNEL_DYNARRAY_LEN(&obj->hashes) != obj->length) +    return "Length mismatch for hashes"; +  return NULL; +} + +ssize_t +inclusion_proof_v1_encoded_len(const inclusion_proof_v1_t *obj) +{ +  ssize_t result = 0; + +  if (NULL != inclusion_proof_v1_check(obj)) +     return -1; + + +  /* Length of u64 format IN [T_INCLUSION_PROOF_V1] */ +  result += 8; + +  /* Length of struct ed25519_v1 identifier */ +  result += ed25519_v1_encoded_len(obj->identifier); + +  /* Length of u64 tree_size */ +  result += 8; + +  /* Length of u64 leaf_index */ +  result += 8; + +  /* Length of u64 length */ +  result += 8; + +  /* Length of u8 hashes[length] */ +  result += TRUNNEL_DYNARRAY_LEN(&obj->hashes); +  return result; +} +int +inclusion_proof_v1_clear_errors(inclusion_proof_v1_t *obj) +{ +  int r = obj->trunnel_error_code_; +  obj->trunnel_error_code_ = 0; +  return r; +} +ssize_t +inclusion_proof_v1_encode(uint8_t *output, const size_t avail, const inclusion_proof_v1_t *obj) +{ +  ssize_t result = 0; +  size_t written = 0; +  uint8_t *ptr = output; +  const char *msg; +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  const ssize_t encoded_len = inclusion_proof_v1_encoded_len(obj); +#endif + +  if (NULL != (msg = inclusion_proof_v1_check(obj))) +    goto check_failed; + +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  trunnel_assert(encoded_len >= 0); +#endif + +  /* Encode u64 format IN [T_INCLUSION_PROOF_V1] */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->format)); +  written += 8; ptr += 8; + +  /* Encode struct ed25519_v1 identifier */ +  trunnel_assert(written <= avail); +  result = ed25519_v1_encode(ptr, avail - written, obj->identifier); +  if (result < 0) +    goto fail; /* XXXXXXX !*/ +  written += result; ptr += result; + +  /* Encode u64 tree_size */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->tree_size)); +  written += 8; ptr += 8; + +  /* Encode u64 leaf_index */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->leaf_index)); +  written += 8; ptr += 8; + +  /* Encode u64 length */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->length)); +  written += 8; ptr += 8; + +  /* Encode u8 hashes[length] */ +  { +    size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->hashes); +    trunnel_assert(obj->length == elt_len); +    trunnel_assert(written <= avail); +    if (avail - written < elt_len) +      goto truncated; +    if (elt_len) +      memcpy(ptr, obj->hashes.elts_, elt_len); +    written += elt_len; ptr += elt_len; +  } + + +  trunnel_assert(ptr == output + written); +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  { +    trunnel_assert(encoded_len >= 0); +    trunnel_assert((size_t)encoded_len == written); +  } + +#endif + +  return written; + + truncated: +  result = -2; +  goto fail; + check_failed: +  (void)msg; +  result = -1; +  goto fail; + fail: +  trunnel_assert(result < 0); +  return result; +} + +/** As inclusion_proof_v1_parse(), but do not allocate the output + * object. + */ +static ssize_t +inclusion_proof_v1_parse_into(inclusion_proof_v1_t *obj, const uint8_t *input, const size_t len_in) +{ +  const uint8_t *ptr = input; +  size_t remaining = len_in; +  ssize_t result = 0; +  (void)result; + +  /* Parse u64 format IN [T_INCLUSION_PROOF_V1] */ +  CHECK_REMAINING(8, truncated); +  obj->format = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; +  if (! (obj->format == T_INCLUSION_PROOF_V1)) +    goto fail; + +  /* Parse struct ed25519_v1 identifier */ +  result = ed25519_v1_parse(&obj->identifier, ptr, remaining); +  if (result < 0) +    goto relay_fail; +  trunnel_assert((size_t)result <= remaining); +  remaining -= result; ptr += result; + +  /* Parse u64 tree_size */ +  CHECK_REMAINING(8, truncated); +  obj->tree_size = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u64 leaf_index */ +  CHECK_REMAINING(8, truncated); +  obj->leaf_index = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u64 length */ +  CHECK_REMAINING(8, truncated); +  obj->length = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; + +  /* Parse u8 hashes[length] */ +  CHECK_REMAINING(obj->length, truncated); +  TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->hashes, obj->length, {}); +  obj->hashes.n_ = obj->length; +  if (obj->length) +    memcpy(obj->hashes.elts_, ptr, obj->length); +  ptr += obj->length; remaining -= obj->length; +  trunnel_assert(ptr + remaining == input + len_in); +  return len_in - remaining; + + truncated: +  return -2; + relay_fail: +  trunnel_assert(result < 0); +  return result; + trunnel_alloc_failed: +  return -1; + fail: +  result = -1; +  return result; +} + +ssize_t +inclusion_proof_v1_parse(inclusion_proof_v1_t **output, const uint8_t *input, const size_t len_in) +{ +  ssize_t result; +  *output = inclusion_proof_v1_new(); +  if (NULL == *output) +    return -1; +  result = inclusion_proof_v1_parse_into(*output, input, len_in); +  if (result < 0) { +    inclusion_proof_v1_free(*output); +    *output = NULL; +  } +  return result; +} +request_v1_t * +request_v1_new(void) +{ +  request_v1_t *val = trunnel_calloc(1, sizeof(request_v1_t)); +  if (NULL == val) +    return NULL; +  val->format = T_GET_CONSISTENCY_PROOF_V1; +  return val; +} + +/** Release all storage held inside 'obj', but do not free 'obj'. + */ +static void +request_v1_clear(request_v1_t *obj) +{ +  (void) obj; +  req_get_entries_v1_free(obj->request_get_entries); +  obj->request_get_entries = NULL; +  req_get_proof_by_hash_v1_free(obj->request_get_proof_by_hash); +  obj->request_get_proof_by_hash = NULL; +  req_get_consistency_proof_v1_free(obj->request_get_consistency_proof); +  obj->request_get_consistency_proof = NULL; +} + +void +request_v1_free(request_v1_t *obj) +{ +  if (obj == NULL) +    return; +  request_v1_clear(obj); +  trunnel_memwipe(obj, sizeof(request_v1_t)); +  trunnel_free_(obj); +} + +uint64_t +request_v1_get_format(const request_v1_t *inp) +{ +  return inp->format; +} +int +request_v1_set_format(request_v1_t *inp, uint64_t val) +{ +  if (! ((val == T_GET_CONSISTENCY_PROOF_V1 || val == T_GET_ENTRIES_V1 || val == T_GET_PROOF_BY_HASH_V1))) { +     TRUNNEL_SET_ERROR_CODE(inp); +     return -1; +  } +  inp->format = val; +  return 0; +} +struct req_get_entries_v1_st * +request_v1_get_request_get_entries(request_v1_t *inp) +{ +  return inp->request_get_entries; +} +const struct req_get_entries_v1_st * +request_v1_getconst_request_get_entries(const request_v1_t *inp) +{ +  return request_v1_get_request_get_entries((request_v1_t*) inp); +} +int +request_v1_set_request_get_entries(request_v1_t *inp, struct req_get_entries_v1_st *val) +{ +  if (inp->request_get_entries && inp->request_get_entries != val) +    req_get_entries_v1_free(inp->request_get_entries); +  return request_v1_set0_request_get_entries(inp, val); +} +int +request_v1_set0_request_get_entries(request_v1_t *inp, struct req_get_entries_v1_st *val) +{ +  inp->request_get_entries = val; +  return 0; +} +struct req_get_proof_by_hash_v1_st * +request_v1_get_request_get_proof_by_hash(request_v1_t *inp) +{ +  return inp->request_get_proof_by_hash; +} +const struct req_get_proof_by_hash_v1_st * +request_v1_getconst_request_get_proof_by_hash(const request_v1_t *inp) +{ +  return request_v1_get_request_get_proof_by_hash((request_v1_t*) inp); +} +int +request_v1_set_request_get_proof_by_hash(request_v1_t *inp, struct req_get_proof_by_hash_v1_st *val) +{ +  if (inp->request_get_proof_by_hash && inp->request_get_proof_by_hash != val) +    req_get_proof_by_hash_v1_free(inp->request_get_proof_by_hash); +  return request_v1_set0_request_get_proof_by_hash(inp, val); +} +int +request_v1_set0_request_get_proof_by_hash(request_v1_t *inp, struct req_get_proof_by_hash_v1_st *val) +{ +  inp->request_get_proof_by_hash = val; +  return 0; +} +struct req_get_consistency_proof_v1_st * +request_v1_get_request_get_consistency_proof(request_v1_t *inp) +{ +  return inp->request_get_consistency_proof; +} +const struct req_get_consistency_proof_v1_st * +request_v1_getconst_request_get_consistency_proof(const request_v1_t *inp) +{ +  return request_v1_get_request_get_consistency_proof((request_v1_t*) inp); +} +int +request_v1_set_request_get_consistency_proof(request_v1_t *inp, struct req_get_consistency_proof_v1_st *val) +{ +  if (inp->request_get_consistency_proof && inp->request_get_consistency_proof != val) +    req_get_consistency_proof_v1_free(inp->request_get_consistency_proof); +  return request_v1_set0_request_get_consistency_proof(inp, val); +} +int +request_v1_set0_request_get_consistency_proof(request_v1_t *inp, struct req_get_consistency_proof_v1_st *val) +{ +  inp->request_get_consistency_proof = val; +  return 0; +} +const char * +request_v1_check(const request_v1_t *obj) +{ +  if (obj == NULL) +    return "Object was NULL"; +  if (obj->trunnel_error_code_) +    return "A set function failed on this object"; +  if (! (obj->format == T_GET_CONSISTENCY_PROOF_V1 || obj->format == T_GET_ENTRIES_V1 || obj->format == T_GET_PROOF_BY_HASH_V1)) +    return "Integer out of bounds"; +  switch (obj->format) { + +    case T_GET_ENTRIES_V1: +      { +        const char *msg; +        if (NULL != (msg = req_get_entries_v1_check(obj->request_get_entries))) +          return msg; +      } +      break; + +    case T_GET_PROOF_BY_HASH_V1: +      { +        const char *msg; +        if (NULL != (msg = req_get_proof_by_hash_v1_check(obj->request_get_proof_by_hash))) +          return msg; +      } +      break; + +    case T_GET_CONSISTENCY_PROOF_V1: +      { +        const char *msg; +        if (NULL != (msg = req_get_consistency_proof_v1_check(obj->request_get_consistency_proof))) +          return msg; +      } +      break; + +    default: +        return "Bad tag for union"; +      break; +  } +  return NULL; +} + +ssize_t +request_v1_encoded_len(const request_v1_t *obj) +{ +  ssize_t result = 0; + +  if (NULL != request_v1_check(obj)) +     return -1; + + +  /* Length of u64 format IN [T_GET_CONSISTENCY_PROOF_V1, T_GET_ENTRIES_V1, T_GET_PROOF_BY_HASH_V1] */ +  result += 8; +  switch (obj->format) { + +    case T_GET_ENTRIES_V1: + +      /* Length of struct req_get_entries_v1 request_get_entries */ +      result += req_get_entries_v1_encoded_len(obj->request_get_entries); +      break; + +    case T_GET_PROOF_BY_HASH_V1: + +      /* Length of struct req_get_proof_by_hash_v1 request_get_proof_by_hash */ +      result += req_get_proof_by_hash_v1_encoded_len(obj->request_get_proof_by_hash); +      break; + +    case T_GET_CONSISTENCY_PROOF_V1: + +      /* Length of struct req_get_consistency_proof_v1 request_get_consistency_proof */ +      result += req_get_consistency_proof_v1_encoded_len(obj->request_get_consistency_proof); +      break; + +    default: +      trunnel_assert(0); +      break; +  } +  return result; +} +int +request_v1_clear_errors(request_v1_t *obj) +{ +  int r = obj->trunnel_error_code_; +  obj->trunnel_error_code_ = 0; +  return r; +} +ssize_t +request_v1_encode(uint8_t *output, const size_t avail, const request_v1_t *obj) +{ +  ssize_t result = 0; +  size_t written = 0; +  uint8_t *ptr = output; +  const char *msg; +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  const ssize_t encoded_len = request_v1_encoded_len(obj); +#endif + +  if (NULL != (msg = request_v1_check(obj))) +    goto check_failed; + +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  trunnel_assert(encoded_len >= 0); +#endif + +  /* Encode u64 format IN [T_GET_CONSISTENCY_PROOF_V1, T_GET_ENTRIES_V1, T_GET_PROOF_BY_HASH_V1] */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->format)); +  written += 8; ptr += 8; + +  /* Encode union request[format] */ +  trunnel_assert(written <= avail); +  switch (obj->format) { + +    case T_GET_ENTRIES_V1: + +      /* Encode struct req_get_entries_v1 request_get_entries */ +      trunnel_assert(written <= avail); +      result = req_get_entries_v1_encode(ptr, avail - written, obj->request_get_entries); +      if (result < 0) +        goto fail; /* XXXXXXX !*/ +      written += result; ptr += result; +      break; + +    case T_GET_PROOF_BY_HASH_V1: + +      /* Encode struct req_get_proof_by_hash_v1 request_get_proof_by_hash */ +      trunnel_assert(written <= avail); +      result = req_get_proof_by_hash_v1_encode(ptr, avail - written, obj->request_get_proof_by_hash); +      if (result < 0) +        goto fail; /* XXXXXXX !*/ +      written += result; ptr += result; +      break; + +    case T_GET_CONSISTENCY_PROOF_V1: + +      /* Encode struct req_get_consistency_proof_v1 request_get_consistency_proof */ +      trunnel_assert(written <= avail); +      result = req_get_consistency_proof_v1_encode(ptr, avail - written, obj->request_get_consistency_proof); +      if (result < 0) +        goto fail; /* XXXXXXX !*/ +      written += result; ptr += result; +      break; + +    default: +      trunnel_assert(0); +      break; +  } + + +  trunnel_assert(ptr == output + written); +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  { +    trunnel_assert(encoded_len >= 0); +    trunnel_assert((size_t)encoded_len == written); +  } + +#endif + +  return written; + + truncated: +  result = -2; +  goto fail; + check_failed: +  (void)msg; +  result = -1; +  goto fail; + fail: +  trunnel_assert(result < 0); +  return result; +} + +/** As request_v1_parse(), but do not allocate the output object. + */ +static ssize_t +request_v1_parse_into(request_v1_t *obj, const uint8_t *input, const size_t len_in) +{ +  const uint8_t *ptr = input; +  size_t remaining = len_in; +  ssize_t result = 0; +  (void)result; + +  /* Parse u64 format IN [T_GET_CONSISTENCY_PROOF_V1, T_GET_ENTRIES_V1, T_GET_PROOF_BY_HASH_V1] */ +  CHECK_REMAINING(8, truncated); +  obj->format = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; +  if (! (obj->format == T_GET_CONSISTENCY_PROOF_V1 || obj->format == T_GET_ENTRIES_V1 || obj->format == T_GET_PROOF_BY_HASH_V1)) +    goto fail; + +  /* Parse union request[format] */ +  switch (obj->format) { + +    case T_GET_ENTRIES_V1: + +      /* Parse struct req_get_entries_v1 request_get_entries */ +      result = req_get_entries_v1_parse(&obj->request_get_entries, ptr, remaining); +      if (result < 0) +        goto relay_fail; +      trunnel_assert((size_t)result <= remaining); +      remaining -= result; ptr += result; +      break; + +    case T_GET_PROOF_BY_HASH_V1: + +      /* Parse struct req_get_proof_by_hash_v1 request_get_proof_by_hash */ +      result = req_get_proof_by_hash_v1_parse(&obj->request_get_proof_by_hash, ptr, remaining); +      if (result < 0) +        goto relay_fail; +      trunnel_assert((size_t)result <= remaining); +      remaining -= result; ptr += result; +      break; + +    case T_GET_CONSISTENCY_PROOF_V1: + +      /* Parse struct req_get_consistency_proof_v1 request_get_consistency_proof */ +      result = req_get_consistency_proof_v1_parse(&obj->request_get_consistency_proof, ptr, remaining); +      if (result < 0) +        goto relay_fail; +      trunnel_assert((size_t)result <= remaining); +      remaining -= result; ptr += result; +      break; + +    default: +      goto fail; +      break; +  } +  trunnel_assert(ptr + remaining == input + len_in); +  return len_in - remaining; + + truncated: +  return -2; + relay_fail: +  trunnel_assert(result < 0); +  return result; + fail: +  result = -1; +  return result; +} + +ssize_t +request_v1_parse(request_v1_t **output, const uint8_t *input, const size_t len_in) +{ +  ssize_t result; +  *output = request_v1_new(); +  if (NULL == *output) +    return -1; +  result = request_v1_parse_into(*output, input, len_in); +  if (result < 0) { +    request_v1_free(*output); +    *output = NULL; +  } +  return result; +} +signed_checksum32_ed25519_v1_t * +signed_checksum32_ed25519_v1_new(void) +{ +  signed_checksum32_ed25519_v1_t *val = trunnel_calloc(1, sizeof(signed_checksum32_ed25519_v1_t)); +  if (NULL == val) +    return NULL; +  val->format = T_SIGNED_CHECKSUM32_ED25519_V1; +  val->length = 1; +  return val; +} + +/** Release all storage held inside 'obj', but do not free 'obj'. + */ +static void +signed_checksum32_ed25519_v1_clear(signed_checksum32_ed25519_v1_t *obj) +{ +  (void) obj; +  TRUNNEL_DYNARRAY_WIPE(&obj->identifier); +  TRUNNEL_DYNARRAY_CLEAR(&obj->identifier); +  ed25519_v1_free(obj->namespace); +  obj->namespace = NULL; +} + +void +signed_checksum32_ed25519_v1_free(signed_checksum32_ed25519_v1_t *obj) +{ +  if (obj == NULL) +    return; +  signed_checksum32_ed25519_v1_clear(obj); +  trunnel_memwipe(obj, sizeof(signed_checksum32_ed25519_v1_t)); +  trunnel_free_(obj); +} + +uint64_t +signed_checksum32_ed25519_v1_get_format(const signed_checksum32_ed25519_v1_t *inp) +{ +  return inp->format; +} +int +signed_checksum32_ed25519_v1_set_format(signed_checksum32_ed25519_v1_t *inp, uint64_t val) +{ +  if (! ((val == T_SIGNED_CHECKSUM32_ED25519_V1))) { +     TRUNNEL_SET_ERROR_CODE(inp); +     return -1; +  } +  inp->format = val; +  return 0; +} +size_t +signed_checksum32_ed25519_v1_getlen_checksum(const signed_checksum32_ed25519_v1_t *inp) +{ +  (void)inp;  return 32; +} + +uint8_t +signed_checksum32_ed25519_v1_get_checksum(signed_checksum32_ed25519_v1_t *inp, size_t idx) +{ +  trunnel_assert(idx < 32); +  return inp->checksum[idx]; +} + +uint8_t +signed_checksum32_ed25519_v1_getconst_checksum(const signed_checksum32_ed25519_v1_t *inp, size_t idx) +{ +  return signed_checksum32_ed25519_v1_get_checksum((signed_checksum32_ed25519_v1_t*)inp, idx); +} +int +signed_checksum32_ed25519_v1_set_checksum(signed_checksum32_ed25519_v1_t *inp, size_t idx, uint8_t elt) +{ +  trunnel_assert(idx < 32); +  inp->checksum[idx] = elt; +  return 0; +} + +uint8_t * +signed_checksum32_ed25519_v1_getarray_checksum(signed_checksum32_ed25519_v1_t *inp) +{ +  return inp->checksum; +} +const uint8_t  * +signed_checksum32_ed25519_v1_getconstarray_checksum(const signed_checksum32_ed25519_v1_t *inp) +{ +  return (const uint8_t  *)signed_checksum32_ed25519_v1_getarray_checksum((signed_checksum32_ed25519_v1_t*)inp); +} +uint64_t +signed_checksum32_ed25519_v1_get_length(const signed_checksum32_ed25519_v1_t *inp) +{ +  return inp->length; +} +int +signed_checksum32_ed25519_v1_set_length(signed_checksum32_ed25519_v1_t *inp, uint64_t val) +{ +  if (! (((val >= 1 && val <= 127)))) { +     TRUNNEL_SET_ERROR_CODE(inp); +     return -1; +  } +  inp->length = val; +  return 0; +} +size_t +signed_checksum32_ed25519_v1_getlen_identifier(const signed_checksum32_ed25519_v1_t *inp) +{ +  return TRUNNEL_DYNARRAY_LEN(&inp->identifier); +} + +uint8_t +signed_checksum32_ed25519_v1_get_identifier(signed_checksum32_ed25519_v1_t *inp, size_t idx) +{ +  return TRUNNEL_DYNARRAY_GET(&inp->identifier, idx); +} + +uint8_t +signed_checksum32_ed25519_v1_getconst_identifier(const signed_checksum32_ed25519_v1_t *inp, size_t idx) +{ +  return signed_checksum32_ed25519_v1_get_identifier((signed_checksum32_ed25519_v1_t*)inp, idx); +} +int +signed_checksum32_ed25519_v1_set_identifier(signed_checksum32_ed25519_v1_t *inp, size_t idx, uint8_t elt) +{ +  TRUNNEL_DYNARRAY_SET(&inp->identifier, idx, elt); +  return 0; +} +int +signed_checksum32_ed25519_v1_add_identifier(signed_checksum32_ed25519_v1_t *inp, uint8_t elt) +{ +#if SIZE_MAX >= UINT64_MAX +  if (inp->identifier.n_ == UINT64_MAX) +    goto trunnel_alloc_failed; +#endif +  TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->identifier, elt, {}); +  return 0; + trunnel_alloc_failed: +  TRUNNEL_SET_ERROR_CODE(inp); +  return -1; +} + +uint8_t * +signed_checksum32_ed25519_v1_getarray_identifier(signed_checksum32_ed25519_v1_t *inp) +{ +  return inp->identifier.elts_; +} +const uint8_t  * +signed_checksum32_ed25519_v1_getconstarray_identifier(const signed_checksum32_ed25519_v1_t *inp) +{ +  return (const uint8_t  *)signed_checksum32_ed25519_v1_getarray_identifier((signed_checksum32_ed25519_v1_t*)inp); +} +int +signed_checksum32_ed25519_v1_setlen_identifier(signed_checksum32_ed25519_v1_t *inp, size_t newlen) +{ +  uint8_t *newptr; +#if UINT64_MAX < SIZE_MAX +  if (newlen > UINT64_MAX) +    goto trunnel_alloc_failed; +#endif +  newptr = trunnel_dynarray_setlen(&inp->identifier.allocated_, +                 &inp->identifier.n_, inp->identifier.elts_, newlen, +                 sizeof(inp->identifier.elts_[0]), (trunnel_free_fn_t) NULL, +                 &inp->trunnel_error_code_); +  if (newlen != 0 && newptr == NULL) +    goto trunnel_alloc_failed; +  inp->identifier.elts_ = newptr; +  return 0; + trunnel_alloc_failed: +  TRUNNEL_SET_ERROR_CODE(inp); +  return -1; +} +size_t +signed_checksum32_ed25519_v1_getlen_signature(const signed_checksum32_ed25519_v1_t *inp) +{ +  (void)inp;  return 64; +} + +uint8_t +signed_checksum32_ed25519_v1_get_signature(signed_checksum32_ed25519_v1_t *inp, size_t idx) +{ +  trunnel_assert(idx < 64); +  return inp->signature[idx]; +} + +uint8_t +signed_checksum32_ed25519_v1_getconst_signature(const signed_checksum32_ed25519_v1_t *inp, size_t idx) +{ +  return signed_checksum32_ed25519_v1_get_signature((signed_checksum32_ed25519_v1_t*)inp, idx); +} +int +signed_checksum32_ed25519_v1_set_signature(signed_checksum32_ed25519_v1_t *inp, size_t idx, uint8_t elt) +{ +  trunnel_assert(idx < 64); +  inp->signature[idx] = elt; +  return 0; +} + +uint8_t * +signed_checksum32_ed25519_v1_getarray_signature(signed_checksum32_ed25519_v1_t *inp) +{ +  return inp->signature; +} +const uint8_t  * +signed_checksum32_ed25519_v1_getconstarray_signature(const signed_checksum32_ed25519_v1_t *inp) +{ +  return (const uint8_t  *)signed_checksum32_ed25519_v1_getarray_signature((signed_checksum32_ed25519_v1_t*)inp); +} +struct ed25519_v1_st * +signed_checksum32_ed25519_v1_get_namespace(signed_checksum32_ed25519_v1_t *inp) +{ +  return inp->namespace; +} +const struct ed25519_v1_st * +signed_checksum32_ed25519_v1_getconst_namespace(const signed_checksum32_ed25519_v1_t *inp) +{ +  return signed_checksum32_ed25519_v1_get_namespace((signed_checksum32_ed25519_v1_t*) inp); +} +int +signed_checksum32_ed25519_v1_set_namespace(signed_checksum32_ed25519_v1_t *inp, struct ed25519_v1_st *val) +{ +  if (inp->namespace && inp->namespace != val) +    ed25519_v1_free(inp->namespace); +  return signed_checksum32_ed25519_v1_set0_namespace(inp, val); +} +int +signed_checksum32_ed25519_v1_set0_namespace(signed_checksum32_ed25519_v1_t *inp, struct ed25519_v1_st *val) +{ +  inp->namespace = val; +  return 0; +} +const char * +signed_checksum32_ed25519_v1_check(const signed_checksum32_ed25519_v1_t *obj) +{ +  if (obj == NULL) +    return "Object was NULL"; +  if (obj->trunnel_error_code_) +    return "A set function failed on this object"; +  if (! (obj->format == T_SIGNED_CHECKSUM32_ED25519_V1)) +    return "Integer out of bounds"; +  if (! ((obj->length >= 1 && obj->length <= 127))) +    return "Integer out of bounds"; +  if (TRUNNEL_DYNARRAY_LEN(&obj->identifier) != obj->length) +    return "Length mismatch for identifier"; +  { +    const char *msg; +    if (NULL != (msg = ed25519_v1_check(obj->namespace))) +      return msg; +  } +  return NULL; +} + +ssize_t +signed_checksum32_ed25519_v1_encoded_len(const signed_checksum32_ed25519_v1_t *obj) +{ +  ssize_t result = 0; + +  if (NULL != signed_checksum32_ed25519_v1_check(obj)) +     return -1; + + +  /* Length of u64 format IN [T_SIGNED_CHECKSUM32_ED25519_V1] */ +  result += 8; + +  /* Length of u8 checksum[32] */ +  result += 32; + +  /* Length of u64 length IN [1..127] */ +  result += 8; + +  /* Length of u8 identifier[length] */ +  result += TRUNNEL_DYNARRAY_LEN(&obj->identifier); + +  /* Length of u8 signature[64] */ +  result += 64; + +  /* Length of struct ed25519_v1 namespace */ +  result += ed25519_v1_encoded_len(obj->namespace); +  return result; +} +int +signed_checksum32_ed25519_v1_clear_errors(signed_checksum32_ed25519_v1_t *obj) +{ +  int r = obj->trunnel_error_code_; +  obj->trunnel_error_code_ = 0; +  return r; +} +ssize_t +signed_checksum32_ed25519_v1_encode(uint8_t *output, const size_t avail, const signed_checksum32_ed25519_v1_t *obj) +{ +  ssize_t result = 0; +  size_t written = 0; +  uint8_t *ptr = output; +  const char *msg; +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  const ssize_t encoded_len = signed_checksum32_ed25519_v1_encoded_len(obj); +#endif + +  if (NULL != (msg = signed_checksum32_ed25519_v1_check(obj))) +    goto check_failed; + +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  trunnel_assert(encoded_len >= 0); +#endif + +  /* Encode u64 format IN [T_SIGNED_CHECKSUM32_ED25519_V1] */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->format)); +  written += 8; ptr += 8; + +  /* Encode u8 checksum[32] */ +  trunnel_assert(written <= avail); +  if (avail - written < 32) +    goto truncated; +  memcpy(ptr, obj->checksum, 32); +  written += 32; ptr += 32; + +  /* Encode u64 length IN [1..127] */ +  trunnel_assert(written <= avail); +  if (avail - written < 8) +    goto truncated; +  trunnel_set_uint64(ptr, trunnel_htonll(obj->length)); +  written += 8; ptr += 8; + +  /* Encode u8 identifier[length] */ +  { +    size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->identifier); +    trunnel_assert(obj->length == elt_len); +    trunnel_assert(written <= avail); +    if (avail - written < elt_len) +      goto truncated; +    if (elt_len) +      memcpy(ptr, obj->identifier.elts_, elt_len); +    written += elt_len; ptr += elt_len; +  } + +  /* Encode u8 signature[64] */ +  trunnel_assert(written <= avail); +  if (avail - written < 64) +    goto truncated; +  memcpy(ptr, obj->signature, 64); +  written += 64; ptr += 64; + +  /* Encode struct ed25519_v1 namespace */ +  trunnel_assert(written <= avail); +  result = ed25519_v1_encode(ptr, avail - written, obj->namespace); +  if (result < 0) +    goto fail; /* XXXXXXX !*/ +  written += result; ptr += result; + + +  trunnel_assert(ptr == output + written); +#ifdef TRUNNEL_CHECK_ENCODED_LEN +  { +    trunnel_assert(encoded_len >= 0); +    trunnel_assert((size_t)encoded_len == written); +  } + +#endif + +  return written; + + truncated: +  result = -2; +  goto fail; + check_failed: +  (void)msg; +  result = -1; +  goto fail; + fail: +  trunnel_assert(result < 0); +  return result; +} + +/** As signed_checksum32_ed25519_v1_parse(), but do not allocate the + * output object. + */ +static ssize_t +signed_checksum32_ed25519_v1_parse_into(signed_checksum32_ed25519_v1_t *obj, const uint8_t *input, const size_t len_in) +{ +  const uint8_t *ptr = input; +  size_t remaining = len_in; +  ssize_t result = 0; +  (void)result; + +  /* Parse u64 format IN [T_SIGNED_CHECKSUM32_ED25519_V1] */ +  CHECK_REMAINING(8, truncated); +  obj->format = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; +  if (! (obj->format == T_SIGNED_CHECKSUM32_ED25519_V1)) +    goto fail; + +  /* Parse u8 checksum[32] */ +  CHECK_REMAINING(32, truncated); +  memcpy(obj->checksum, ptr, 32); +  remaining -= 32; ptr += 32; + +  /* Parse u64 length IN [1..127] */ +  CHECK_REMAINING(8, truncated); +  obj->length = trunnel_ntohll(trunnel_get_uint64(ptr)); +  remaining -= 8; ptr += 8; +  if (! ((obj->length >= 1 && obj->length <= 127))) +    goto fail; + +  /* Parse u8 identifier[length] */ +  CHECK_REMAINING(obj->length, truncated); +  TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->identifier, obj->length, {}); +  obj->identifier.n_ = obj->length; +  if (obj->length) +    memcpy(obj->identifier.elts_, ptr, obj->length); +  ptr += obj->length; remaining -= obj->length; + +  /* Parse u8 signature[64] */ +  CHECK_REMAINING(64, truncated); +  memcpy(obj->signature, ptr, 64); +  remaining -= 64; ptr += 64; + +  /* Parse struct ed25519_v1 namespace */ +  result = ed25519_v1_parse(&obj->namespace, ptr, remaining); +  if (result < 0) +    goto relay_fail; +  trunnel_assert((size_t)result <= remaining); +  remaining -= result; ptr += result; +  trunnel_assert(ptr + remaining == input + len_in); +  return len_in - remaining; + + truncated: +  return -2; + relay_fail: +  trunnel_assert(result < 0); +  return result; + trunnel_alloc_failed: +  return -1; + fail: +  result = -1; +  return result; +} + +ssize_t +signed_checksum32_ed25519_v1_parse(signed_checksum32_ed25519_v1_t **output, const uint8_t *input, const size_t len_in) +{ +  ssize_t result; +  *output = signed_checksum32_ed25519_v1_new(); +  if (NULL == *output) +    return -1; +  result = signed_checksum32_ed25519_v1_parse_into(*output, input, len_in); +  if (result < 0) { +    signed_checksum32_ed25519_v1_free(*output); +    *output = NULL; +  } +  return result; +} diff --git a/trunnel/stfe.h b/trunnel/stfe.h new file mode 100644 index 0000000..c92d1e4 --- /dev/null +++ b/trunnel/stfe.h @@ -0,0 +1,985 @@ +/* stfe.h -- generated by Trunnel v1.5.3. + * https://gitweb.torproject.org/trunnel.git + * You probably shouldn't edit this file. + */ +#ifndef TRUNNEL_STFE_H +#define TRUNNEL_STFE_H + +#include <stdint.h> +#include "trunnel.h" + +#define T_GET_ENTRIES_V1 1 +#define T_GET_PROOF_BY_HASH_V1 2 +#define T_GET_CONSISTENCY_PROOF_V1 3 +#define T_INCLUSION_PROOF_V1 4 +#define T_CONSISTENCY_PROOF_V1 5 +#define T_SIGNED_TREE_HEAD_V1 6 +#define T_SIGNED_CHECKSUM32_ED25519_V1 7 +#define T_ED25519_V1 8 +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_ED25519_V1) +struct ed25519_v1_st { +  uint64_t format; +  uint8_t pubkey[32]; +  uint8_t trunnel_error_code_; +}; +#endif +typedef struct ed25519_v1_st ed25519_v1_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_REQ_GET_CONSISTENCY_PROOF_V1) +struct req_get_consistency_proof_v1_st { +  uint64_t old_size; +  uint64_t new_size; +  uint8_t trunnel_error_code_; +}; +#endif +typedef struct req_get_consistency_proof_v1_st req_get_consistency_proof_v1_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_REQ_GET_ENTRIES_V1) +struct req_get_entries_v1_st { +  uint64_t start_size; +  uint64_t end_size; +  uint8_t trunnel_error_code_; +}; +#endif +typedef struct req_get_entries_v1_st req_get_entries_v1_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_REQ_GET_PROOF_BY_HASH_V1) +struct req_get_proof_by_hash_v1_st { +  uint64_t tree_size; +  uint8_t leaf_hash[32]; +  uint8_t trunnel_error_code_; +}; +#endif +typedef struct req_get_proof_by_hash_v1_st req_get_proof_by_hash_v1_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_SIGNED_TREE_HEAD_V1) +struct signed_tree_head_v1_st { +  uint64_t format; +  uint64_t timestamp; +  uint64_t tree_size; +  uint8_t root_hash[32]; +  uint64_t length; +  TRUNNEL_DYNARRAY_HEAD(, uint8_t) sigident; +  uint8_t trunnel_error_code_; +}; +#endif +typedef struct signed_tree_head_v1_st signed_tree_head_v1_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CONSISTENCY_PROOF_V1) +struct consistency_proof_v1_st { +  uint64_t format; +  struct ed25519_v1_st *identifier; +  uint64_t old_size; +  uint64_t new_size; +  uint64_t length; +  TRUNNEL_DYNARRAY_HEAD(, uint8_t) hashes; +  uint8_t trunnel_error_code_; +}; +#endif +typedef struct consistency_proof_v1_st consistency_proof_v1_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_INCLUSION_PROOF_V1) +struct inclusion_proof_v1_st { +  uint64_t format; +  struct ed25519_v1_st *identifier; +  uint64_t tree_size; +  uint64_t leaf_index; +  uint64_t length; +  TRUNNEL_DYNARRAY_HEAD(, uint8_t) hashes; +  uint8_t trunnel_error_code_; +}; +#endif +typedef struct inclusion_proof_v1_st inclusion_proof_v1_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_REQUEST_V1) +struct request_v1_st { +  uint64_t format; +  struct req_get_entries_v1_st *request_get_entries; +  struct req_get_proof_by_hash_v1_st *request_get_proof_by_hash; +  struct req_get_consistency_proof_v1_st *request_get_consistency_proof; +  uint8_t trunnel_error_code_; +}; +#endif +typedef struct request_v1_st request_v1_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_SIGNED_CHECKSUM32_ED25519_V1) +struct signed_checksum32_ed25519_v1_st { +  uint64_t format; +  uint8_t checksum[32]; +  uint64_t length; +  TRUNNEL_DYNARRAY_HEAD(, uint8_t) identifier; +  uint8_t signature[64]; +  struct ed25519_v1_st *namespace; +  uint8_t trunnel_error_code_; +}; +#endif +typedef struct signed_checksum32_ed25519_v1_st signed_checksum32_ed25519_v1_t; +/** Return a newly allocated ed25519_v1 with all elements set to zero. + */ +ed25519_v1_t *ed25519_v1_new(void); +/** Release all storage held by the ed25519_v1 in 'victim'. (Do + * nothing if 'victim' is NULL.) + */ +void ed25519_v1_free(ed25519_v1_t *victim); +/** Try to parse a ed25519_v1 from the buffer in 'input', using up to + * 'len_in' bytes from the input buffer. On success, return the number + * of bytes consumed and set *output to the newly allocated + * ed25519_v1_t. On failure, return -2 if the input appears truncated, + * and -1 if the input is otherwise invalid. + */ +ssize_t ed25519_v1_parse(ed25519_v1_t **output, const uint8_t *input, const size_t len_in); +/** Return the number of bytes we expect to need to encode the + * ed25519_v1 in 'obj'. On failure, return a negative value. Note that + * this value may be an overestimate, and can even be an underestimate + * for certain unencodeable objects. + */ +ssize_t ed25519_v1_encoded_len(const ed25519_v1_t *obj); +/** Try to encode the ed25519_v1 from 'input' into the buffer at + * 'output', using up to 'avail' bytes of the output buffer. On + * success, return the number of bytes used. On failure, return -2 if + * the buffer was not long enough, and -1 if the input was invalid. + */ +ssize_t ed25519_v1_encode(uint8_t *output, size_t avail, const ed25519_v1_t *input); +/** Check whether the internal state of the ed25519_v1 in 'obj' is + * consistent. Return NULL if it is, and a short message if it is not. + */ +const char *ed25519_v1_check(const ed25519_v1_t *obj); +/** Clear any errors that were set on the object 'obj' by its setter + * functions. Return true iff errors were cleared. + */ +int ed25519_v1_clear_errors(ed25519_v1_t *obj); +/** Return the value of the format field of the ed25519_v1_t in 'inp' + */ +uint64_t ed25519_v1_get_format(const ed25519_v1_t *inp); +/** Set the value of the format field of the ed25519_v1_t in 'inp' to + * 'val'. Return 0 on success; return -1 and set the error code on + * 'inp' on failure. + */ +int ed25519_v1_set_format(ed25519_v1_t *inp, uint64_t val); +/** Return the (constant) length of the array holding the pubkey field + * of the ed25519_v1_t in 'inp'. + */ +size_t ed25519_v1_getlen_pubkey(const ed25519_v1_t *inp); +/** Return the element at position 'idx' of the fixed array field + * pubkey of the ed25519_v1_t in 'inp'. + */ +uint8_t ed25519_v1_get_pubkey(ed25519_v1_t *inp, size_t idx); +/** As ed25519_v1_get_pubkey, but take and return a const pointer + */ +uint8_t ed25519_v1_getconst_pubkey(const ed25519_v1_t *inp, size_t idx); +/** Change the element at position 'idx' of the fixed array field + * pubkey of the ed25519_v1_t in 'inp', so that it will hold the value + * 'elt'. + */ +int ed25519_v1_set_pubkey(ed25519_v1_t *inp, size_t idx, uint8_t elt); +/** Return a pointer to the 32-element array field pubkey of 'inp'. + */ +uint8_t * ed25519_v1_getarray_pubkey(ed25519_v1_t *inp); +/** As ed25519_v1_get_pubkey, but take and return a const pointer + */ +const uint8_t  * ed25519_v1_getconstarray_pubkey(const ed25519_v1_t *inp); +/** Return a newly allocated req_get_consistency_proof_v1 with all + * elements set to zero. + */ +req_get_consistency_proof_v1_t *req_get_consistency_proof_v1_new(void); +/** Release all storage held by the req_get_consistency_proof_v1 in + * 'victim'. (Do nothing if 'victim' is NULL.) + */ +void req_get_consistency_proof_v1_free(req_get_consistency_proof_v1_t *victim); +/** Try to parse a req_get_consistency_proof_v1 from the buffer in + * 'input', using up to 'len_in' bytes from the input buffer. On + * success, return the number of bytes consumed and set *output to the + * newly allocated req_get_consistency_proof_v1_t. On failure, return + * -2 if the input appears truncated, and -1 if the input is otherwise + * invalid. + */ +ssize_t req_get_consistency_proof_v1_parse(req_get_consistency_proof_v1_t **output, const uint8_t *input, const size_t len_in); +/** Return the number of bytes we expect to need to encode the + * req_get_consistency_proof_v1 in 'obj'. On failure, return a + * negative value. Note that this value may be an overestimate, and + * can even be an underestimate for certain unencodeable objects. + */ +ssize_t req_get_consistency_proof_v1_encoded_len(const req_get_consistency_proof_v1_t *obj); +/** Try to encode the req_get_consistency_proof_v1 from 'input' into + * the buffer at 'output', using up to 'avail' bytes of the output + * buffer. On success, return the number of bytes used. On failure, + * return -2 if the buffer was not long enough, and -1 if the input + * was invalid. + */ +ssize_t req_get_consistency_proof_v1_encode(uint8_t *output, size_t avail, const req_get_consistency_proof_v1_t *input); +/** Check whether the internal state of the + * req_get_consistency_proof_v1 in 'obj' is consistent. Return NULL if + * it is, and a short message if it is not. + */ +const char *req_get_consistency_proof_v1_check(const req_get_consistency_proof_v1_t *obj); +/** Clear any errors that were set on the object 'obj' by its setter + * functions. Return true iff errors were cleared. + */ +int req_get_consistency_proof_v1_clear_errors(req_get_consistency_proof_v1_t *obj); +/** Return the value of the old_size field of the + * req_get_consistency_proof_v1_t in 'inp' + */ +uint64_t req_get_consistency_proof_v1_get_old_size(const req_get_consistency_proof_v1_t *inp); +/** Set the value of the old_size field of the + * req_get_consistency_proof_v1_t in 'inp' to 'val'. Return 0 on + * success; return -1 and set the error code on 'inp' on failure. + */ +int req_get_consistency_proof_v1_set_old_size(req_get_consistency_proof_v1_t *inp, uint64_t val); +/** Return the value of the new_size field of the + * req_get_consistency_proof_v1_t in 'inp' + */ +uint64_t req_get_consistency_proof_v1_get_new_size(const req_get_consistency_proof_v1_t *inp); +/** Set the value of the new_size field of the + * req_get_consistency_proof_v1_t in 'inp' to 'val'. Return 0 on + * success; return -1 and set the error code on 'inp' on failure. + */ +int req_get_consistency_proof_v1_set_new_size(req_get_consistency_proof_v1_t *inp, uint64_t val); +/** Return a newly allocated req_get_entries_v1 with all elements set + * to zero. + */ +req_get_entries_v1_t *req_get_entries_v1_new(void); +/** Release all storage held by the req_get_entries_v1 in 'victim'. + * (Do nothing if 'victim' is NULL.) + */ +void req_get_entries_v1_free(req_get_entries_v1_t *victim); +/** Try to parse a req_get_entries_v1 from the buffer in 'input', + * using up to 'len_in' bytes from the input buffer. On success, + * return the number of bytes consumed and set *output to the newly + * allocated req_get_entries_v1_t. On failure, return -2 if the input + * appears truncated, and -1 if the input is otherwise invalid. + */ +ssize_t req_get_entries_v1_parse(req_get_entries_v1_t **output, const uint8_t *input, const size_t len_in); +/** Return the number of bytes we expect to need to encode the + * req_get_entries_v1 in 'obj'. On failure, return a negative value. + * Note that this value may be an overestimate, and can even be an + * underestimate for certain unencodeable objects. + */ +ssize_t req_get_entries_v1_encoded_len(const req_get_entries_v1_t *obj); +/** Try to encode the req_get_entries_v1 from 'input' into the buffer + * at 'output', using up to 'avail' bytes of the output buffer. On + * success, return the number of bytes used. On failure, return -2 if + * the buffer was not long enough, and -1 if the input was invalid. + */ +ssize_t req_get_entries_v1_encode(uint8_t *output, size_t avail, const req_get_entries_v1_t *input); +/** Check whether the internal state of the req_get_entries_v1 in + * 'obj' is consistent. Return NULL if it is, and a short message if + * it is not. + */ +const char *req_get_entries_v1_check(const req_get_entries_v1_t *obj); +/** Clear any errors that were set on the object 'obj' by its setter + * functions. Return true iff errors were cleared. + */ +int req_get_entries_v1_clear_errors(req_get_entries_v1_t *obj); +/** Return the value of the start_size field of the + * req_get_entries_v1_t in 'inp' + */ +uint64_t req_get_entries_v1_get_start_size(const req_get_entries_v1_t *inp); +/** Set the value of the start_size field of the req_get_entries_v1_t + * in 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int req_get_entries_v1_set_start_size(req_get_entries_v1_t *inp, uint64_t val); +/** Return the value of the end_size field of the req_get_entries_v1_t + * in 'inp' + */ +uint64_t req_get_entries_v1_get_end_size(const req_get_entries_v1_t *inp); +/** Set the value of the end_size field of the req_get_entries_v1_t in + * 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int req_get_entries_v1_set_end_size(req_get_entries_v1_t *inp, uint64_t val); +/** Return a newly allocated req_get_proof_by_hash_v1 with all + * elements set to zero. + */ +req_get_proof_by_hash_v1_t *req_get_proof_by_hash_v1_new(void); +/** Release all storage held by the req_get_proof_by_hash_v1 in + * 'victim'. (Do nothing if 'victim' is NULL.) + */ +void req_get_proof_by_hash_v1_free(req_get_proof_by_hash_v1_t *victim); +/** Try to parse a req_get_proof_by_hash_v1 from the buffer in + * 'input', using up to 'len_in' bytes from the input buffer. On + * success, return the number of bytes consumed and set *output to the + * newly allocated req_get_proof_by_hash_v1_t. On failure, return -2 + * if the input appears truncated, and -1 if the input is otherwise + * invalid. + */ +ssize_t req_get_proof_by_hash_v1_parse(req_get_proof_by_hash_v1_t **output, const uint8_t *input, const size_t len_in); +/** Return the number of bytes we expect to need to encode the + * req_get_proof_by_hash_v1 in 'obj'. On failure, return a negative + * value. Note that this value may be an overestimate, and can even be + * an underestimate for certain unencodeable objects. + */ +ssize_t req_get_proof_by_hash_v1_encoded_len(const req_get_proof_by_hash_v1_t *obj); +/** Try to encode the req_get_proof_by_hash_v1 from 'input' into the + * buffer at 'output', using up to 'avail' bytes of the output buffer. + * On success, return the number of bytes used. On failure, return -2 + * if the buffer was not long enough, and -1 if the input was invalid. + */ +ssize_t req_get_proof_by_hash_v1_encode(uint8_t *output, size_t avail, const req_get_proof_by_hash_v1_t *input); +/** Check whether the internal state of the req_get_proof_by_hash_v1 + * in 'obj' is consistent. Return NULL if it is, and a short message + * if it is not. + */ +const char *req_get_proof_by_hash_v1_check(const req_get_proof_by_hash_v1_t *obj); +/** Clear any errors that were set on the object 'obj' by its setter + * functions. Return true iff errors were cleared. + */ +int req_get_proof_by_hash_v1_clear_errors(req_get_proof_by_hash_v1_t *obj); +/** Return the value of the tree_size field of the + * req_get_proof_by_hash_v1_t in 'inp' + */ +uint64_t req_get_proof_by_hash_v1_get_tree_size(const req_get_proof_by_hash_v1_t *inp); +/** Set the value of the tree_size field of the + * req_get_proof_by_hash_v1_t in 'inp' to 'val'. Return 0 on success; + * return -1 and set the error code on 'inp' on failure. + */ +int req_get_proof_by_hash_v1_set_tree_size(req_get_proof_by_hash_v1_t *inp, uint64_t val); +/** Return the (constant) length of the array holding the leaf_hash + * field of the req_get_proof_by_hash_v1_t in 'inp'. + */ +size_t req_get_proof_by_hash_v1_getlen_leaf_hash(const req_get_proof_by_hash_v1_t *inp); +/** Return the element at position 'idx' of the fixed array field + * leaf_hash of the req_get_proof_by_hash_v1_t in 'inp'. + */ +uint8_t req_get_proof_by_hash_v1_get_leaf_hash(req_get_proof_by_hash_v1_t *inp, size_t idx); +/** As req_get_proof_by_hash_v1_get_leaf_hash, but take and return a + * const pointer + */ +uint8_t req_get_proof_by_hash_v1_getconst_leaf_hash(const req_get_proof_by_hash_v1_t *inp, size_t idx); +/** Change the element at position 'idx' of the fixed array field + * leaf_hash of the req_get_proof_by_hash_v1_t in 'inp', so that it + * will hold the value 'elt'. + */ +int req_get_proof_by_hash_v1_set_leaf_hash(req_get_proof_by_hash_v1_t *inp, size_t idx, uint8_t elt); +/** Return a pointer to the 32-element array field leaf_hash of 'inp'. + */ +uint8_t * req_get_proof_by_hash_v1_getarray_leaf_hash(req_get_proof_by_hash_v1_t *inp); +/** As req_get_proof_by_hash_v1_get_leaf_hash, but take and return a + * const pointer + */ +const uint8_t  * req_get_proof_by_hash_v1_getconstarray_leaf_hash(const req_get_proof_by_hash_v1_t *inp); +/** Return a newly allocated signed_tree_head_v1 with all elements set + * to zero. + */ +signed_tree_head_v1_t *signed_tree_head_v1_new(void); +/** Release all storage held by the signed_tree_head_v1 in 'victim'. + * (Do nothing if 'victim' is NULL.) + */ +void signed_tree_head_v1_free(signed_tree_head_v1_t *victim); +/** Try to parse a signed_tree_head_v1 from the buffer in 'input', + * using up to 'len_in' bytes from the input buffer. On success, + * return the number of bytes consumed and set *output to the newly + * allocated signed_tree_head_v1_t. On failure, return -2 if the input + * appears truncated, and -1 if the input is otherwise invalid. + */ +ssize_t signed_tree_head_v1_parse(signed_tree_head_v1_t **output, const uint8_t *input, const size_t len_in); +/** Return the number of bytes we expect to need to encode the + * signed_tree_head_v1 in 'obj'. On failure, return a negative value. + * Note that this value may be an overestimate, and can even be an + * underestimate for certain unencodeable objects. + */ +ssize_t signed_tree_head_v1_encoded_len(const signed_tree_head_v1_t *obj); +/** Try to encode the signed_tree_head_v1 from 'input' into the buffer + * at 'output', using up to 'avail' bytes of the output buffer. On + * success, return the number of bytes used. On failure, return -2 if + * the buffer was not long enough, and -1 if the input was invalid. + */ +ssize_t signed_tree_head_v1_encode(uint8_t *output, size_t avail, const signed_tree_head_v1_t *input); +/** Check whether the internal state of the signed_tree_head_v1 in + * 'obj' is consistent. Return NULL if it is, and a short message if + * it is not. + */ +const char *signed_tree_head_v1_check(const signed_tree_head_v1_t *obj); +/** Clear any errors that were set on the object 'obj' by its setter + * functions. Return true iff errors were cleared. + */ +int signed_tree_head_v1_clear_errors(signed_tree_head_v1_t *obj); +/** Return the value of the format field of the signed_tree_head_v1_t + * in 'inp' + */ +uint64_t signed_tree_head_v1_get_format(const signed_tree_head_v1_t *inp); +/** Set the value of the format field of the signed_tree_head_v1_t in + * 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int signed_tree_head_v1_set_format(signed_tree_head_v1_t *inp, uint64_t val); +/** Return the value of the timestamp field of the + * signed_tree_head_v1_t in 'inp' + */ +uint64_t signed_tree_head_v1_get_timestamp(const signed_tree_head_v1_t *inp); +/** Set the value of the timestamp field of the signed_tree_head_v1_t + * in 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int signed_tree_head_v1_set_timestamp(signed_tree_head_v1_t *inp, uint64_t val); +/** Return the value of the tree_size field of the + * signed_tree_head_v1_t in 'inp' + */ +uint64_t signed_tree_head_v1_get_tree_size(const signed_tree_head_v1_t *inp); +/** Set the value of the tree_size field of the signed_tree_head_v1_t + * in 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int signed_tree_head_v1_set_tree_size(signed_tree_head_v1_t *inp, uint64_t val); +/** Return the (constant) length of the array holding the root_hash + * field of the signed_tree_head_v1_t in 'inp'. + */ +size_t signed_tree_head_v1_getlen_root_hash(const signed_tree_head_v1_t *inp); +/** Return the element at position 'idx' of the fixed array field + * root_hash of the signed_tree_head_v1_t in 'inp'. + */ +uint8_t signed_tree_head_v1_get_root_hash(signed_tree_head_v1_t *inp, size_t idx); +/** As signed_tree_head_v1_get_root_hash, but take and return a const + * pointer + */ +uint8_t signed_tree_head_v1_getconst_root_hash(const signed_tree_head_v1_t *inp, size_t idx); +/** Change the element at position 'idx' of the fixed array field + * root_hash of the signed_tree_head_v1_t in 'inp', so that it will + * hold the value 'elt'. + */ +int signed_tree_head_v1_set_root_hash(signed_tree_head_v1_t *inp, size_t idx, uint8_t elt); +/** Return a pointer to the 32-element array field root_hash of 'inp'. + */ +uint8_t * signed_tree_head_v1_getarray_root_hash(signed_tree_head_v1_t *inp); +/** As signed_tree_head_v1_get_root_hash, but take and return a const + * pointer + */ +const uint8_t  * signed_tree_head_v1_getconstarray_root_hash(const signed_tree_head_v1_t *inp); +/** Return the value of the length field of the signed_tree_head_v1_t + * in 'inp' + */ +uint64_t signed_tree_head_v1_get_length(const signed_tree_head_v1_t *inp); +/** Set the value of the length field of the signed_tree_head_v1_t in + * 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int signed_tree_head_v1_set_length(signed_tree_head_v1_t *inp, uint64_t val); +/** Return the length of the dynamic array holding the sigident field + * of the signed_tree_head_v1_t in 'inp'. + */ +size_t signed_tree_head_v1_getlen_sigident(const signed_tree_head_v1_t *inp); +/** Return the element at position 'idx' of the dynamic array field + * sigident of the signed_tree_head_v1_t in 'inp'. + */ +uint8_t signed_tree_head_v1_get_sigident(signed_tree_head_v1_t *inp, size_t idx); +/** As signed_tree_head_v1_get_sigident, but take and return a const + * pointer + */ +uint8_t signed_tree_head_v1_getconst_sigident(const signed_tree_head_v1_t *inp, size_t idx); +/** Change the element at position 'idx' of the dynamic array field + * sigident of the signed_tree_head_v1_t in 'inp', so that it will + * hold the value 'elt'. + */ +int signed_tree_head_v1_set_sigident(signed_tree_head_v1_t *inp, size_t idx, uint8_t elt); +/** Append a new element 'elt' to the dynamic array field sigident of + * the signed_tree_head_v1_t in 'inp'. + */ +int signed_tree_head_v1_add_sigident(signed_tree_head_v1_t *inp, uint8_t elt); +/** Return a pointer to the variable-length array field sigident of + * 'inp'. + */ +uint8_t * signed_tree_head_v1_getarray_sigident(signed_tree_head_v1_t *inp); +/** As signed_tree_head_v1_get_sigident, but take and return a const + * pointer + */ +const uint8_t  * signed_tree_head_v1_getconstarray_sigident(const signed_tree_head_v1_t *inp); +/** Change the length of the variable-length array field sigident of + * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; + * return -1 and set the error code on 'inp' on failure. + */ +int signed_tree_head_v1_setlen_sigident(signed_tree_head_v1_t *inp, size_t newlen); +/** Return a newly allocated consistency_proof_v1 with all elements + * set to zero. + */ +consistency_proof_v1_t *consistency_proof_v1_new(void); +/** Release all storage held by the consistency_proof_v1 in 'victim'. + * (Do nothing if 'victim' is NULL.) + */ +void consistency_proof_v1_free(consistency_proof_v1_t *victim); +/** Try to parse a consistency_proof_v1 from the buffer in 'input', + * using up to 'len_in' bytes from the input buffer. On success, + * return the number of bytes consumed and set *output to the newly + * allocated consistency_proof_v1_t. On failure, return -2 if the + * input appears truncated, and -1 if the input is otherwise invalid. + */ +ssize_t consistency_proof_v1_parse(consistency_proof_v1_t **output, const uint8_t *input, const size_t len_in); +/** Return the number of bytes we expect to need to encode the + * consistency_proof_v1 in 'obj'. On failure, return a negative value. + * Note that this value may be an overestimate, and can even be an + * underestimate for certain unencodeable objects. + */ +ssize_t consistency_proof_v1_encoded_len(const consistency_proof_v1_t *obj); +/** Try to encode the consistency_proof_v1 from 'input' into the + * buffer at 'output', using up to 'avail' bytes of the output buffer. + * On success, return the number of bytes used. On failure, return -2 + * if the buffer was not long enough, and -1 if the input was invalid. + */ +ssize_t consistency_proof_v1_encode(uint8_t *output, size_t avail, const consistency_proof_v1_t *input); +/** Check whether the internal state of the consistency_proof_v1 in + * 'obj' is consistent. Return NULL if it is, and a short message if + * it is not. + */ +const char *consistency_proof_v1_check(const consistency_proof_v1_t *obj); +/** Clear any errors that were set on the object 'obj' by its setter + * functions. Return true iff errors were cleared. + */ +int consistency_proof_v1_clear_errors(consistency_proof_v1_t *obj); +/** Return the value of the format field of the consistency_proof_v1_t + * in 'inp' + */ +uint64_t consistency_proof_v1_get_format(const consistency_proof_v1_t *inp); +/** Set the value of the format field of the consistency_proof_v1_t in + * 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int consistency_proof_v1_set_format(consistency_proof_v1_t *inp, uint64_t val); +/** Return the value of the identifier field of the + * consistency_proof_v1_t in 'inp' + */ +struct ed25519_v1_st * consistency_proof_v1_get_identifier(consistency_proof_v1_t *inp); +/** As consistency_proof_v1_get_identifier, but take and return a + * const pointer + */ +const struct ed25519_v1_st * consistency_proof_v1_getconst_identifier(const consistency_proof_v1_t *inp); +/** Set the value of the identifier field of the + * consistency_proof_v1_t in 'inp' to 'val'. Free the old value if + * any. Steals the referenceto 'val'.Return 0 on success; return -1 + * and set the error code on 'inp' on failure. + */ +int consistency_proof_v1_set_identifier(consistency_proof_v1_t *inp, struct ed25519_v1_st *val); +/** As consistency_proof_v1_set_identifier, but does not free the + * previous value. + */ +int consistency_proof_v1_set0_identifier(consistency_proof_v1_t *inp, struct ed25519_v1_st *val); +/** Return the value of the old_size field of the + * consistency_proof_v1_t in 'inp' + */ +uint64_t consistency_proof_v1_get_old_size(const consistency_proof_v1_t *inp); +/** Set the value of the old_size field of the consistency_proof_v1_t + * in 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int consistency_proof_v1_set_old_size(consistency_proof_v1_t *inp, uint64_t val); +/** Return the value of the new_size field of the + * consistency_proof_v1_t in 'inp' + */ +uint64_t consistency_proof_v1_get_new_size(const consistency_proof_v1_t *inp); +/** Set the value of the new_size field of the consistency_proof_v1_t + * in 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int consistency_proof_v1_set_new_size(consistency_proof_v1_t *inp, uint64_t val); +/** Return the value of the length field of the consistency_proof_v1_t + * in 'inp' + */ +uint64_t consistency_proof_v1_get_length(const consistency_proof_v1_t *inp); +/** Set the value of the length field of the consistency_proof_v1_t in + * 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int consistency_proof_v1_set_length(consistency_proof_v1_t *inp, uint64_t val); +/** Return the length of the dynamic array holding the hashes field of + * the consistency_proof_v1_t in 'inp'. + */ +size_t consistency_proof_v1_getlen_hashes(const consistency_proof_v1_t *inp); +/** Return the element at position 'idx' of the dynamic array field + * hashes of the consistency_proof_v1_t in 'inp'. + */ +uint8_t consistency_proof_v1_get_hashes(consistency_proof_v1_t *inp, size_t idx); +/** As consistency_proof_v1_get_hashes, but take and return a const + * pointer + */ +uint8_t consistency_proof_v1_getconst_hashes(const consistency_proof_v1_t *inp, size_t idx); +/** Change the element at position 'idx' of the dynamic array field + * hashes of the consistency_proof_v1_t in 'inp', so that it will hold + * the value 'elt'. + */ +int consistency_proof_v1_set_hashes(consistency_proof_v1_t *inp, size_t idx, uint8_t elt); +/** Append a new element 'elt' to the dynamic array field hashes of + * the consistency_proof_v1_t in 'inp'. + */ +int consistency_proof_v1_add_hashes(consistency_proof_v1_t *inp, uint8_t elt); +/** Return a pointer to the variable-length array field hashes of + * 'inp'. + */ +uint8_t * consistency_proof_v1_getarray_hashes(consistency_proof_v1_t *inp); +/** As consistency_proof_v1_get_hashes, but take and return a const + * pointer + */ +const uint8_t  * consistency_proof_v1_getconstarray_hashes(const consistency_proof_v1_t *inp); +/** Change the length of the variable-length array field hashes of + * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; + * return -1 and set the error code on 'inp' on failure. + */ +int consistency_proof_v1_setlen_hashes(consistency_proof_v1_t *inp, size_t newlen); +/** Return a newly allocated inclusion_proof_v1 with all elements set + * to zero. + */ +inclusion_proof_v1_t *inclusion_proof_v1_new(void); +/** Release all storage held by the inclusion_proof_v1 in 'victim'. + * (Do nothing if 'victim' is NULL.) + */ +void inclusion_proof_v1_free(inclusion_proof_v1_t *victim); +/** Try to parse a inclusion_proof_v1 from the buffer in 'input', + * using up to 'len_in' bytes from the input buffer. On success, + * return the number of bytes consumed and set *output to the newly + * allocated inclusion_proof_v1_t. On failure, return -2 if the input + * appears truncated, and -1 if the input is otherwise invalid. + */ +ssize_t inclusion_proof_v1_parse(inclusion_proof_v1_t **output, const uint8_t *input, const size_t len_in); +/** Return the number of bytes we expect to need to encode the + * inclusion_proof_v1 in 'obj'. On failure, return a negative value. + * Note that this value may be an overestimate, and can even be an + * underestimate for certain unencodeable objects. + */ +ssize_t inclusion_proof_v1_encoded_len(const inclusion_proof_v1_t *obj); +/** Try to encode the inclusion_proof_v1 from 'input' into the buffer + * at 'output', using up to 'avail' bytes of the output buffer. On + * success, return the number of bytes used. On failure, return -2 if + * the buffer was not long enough, and -1 if the input was invalid. + */ +ssize_t inclusion_proof_v1_encode(uint8_t *output, size_t avail, const inclusion_proof_v1_t *input); +/** Check whether the internal state of the inclusion_proof_v1 in + * 'obj' is consistent. Return NULL if it is, and a short message if + * it is not. + */ +const char *inclusion_proof_v1_check(const inclusion_proof_v1_t *obj); +/** Clear any errors that were set on the object 'obj' by its setter + * functions. Return true iff errors were cleared. + */ +int inclusion_proof_v1_clear_errors(inclusion_proof_v1_t *obj); +/** Return the value of the format field of the inclusion_proof_v1_t + * in 'inp' + */ +uint64_t inclusion_proof_v1_get_format(const inclusion_proof_v1_t *inp); +/** Set the value of the format field of the inclusion_proof_v1_t in + * 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int inclusion_proof_v1_set_format(inclusion_proof_v1_t *inp, uint64_t val); +/** Return the value of the identifier field of the + * inclusion_proof_v1_t in 'inp' + */ +struct ed25519_v1_st * inclusion_proof_v1_get_identifier(inclusion_proof_v1_t *inp); +/** As inclusion_proof_v1_get_identifier, but take and return a const + * pointer + */ +const struct ed25519_v1_st * inclusion_proof_v1_getconst_identifier(const inclusion_proof_v1_t *inp); +/** Set the value of the identifier field of the inclusion_proof_v1_t + * in 'inp' to 'val'. Free the old value if any. Steals the + * referenceto 'val'.Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int inclusion_proof_v1_set_identifier(inclusion_proof_v1_t *inp, struct ed25519_v1_st *val); +/** As inclusion_proof_v1_set_identifier, but does not free the + * previous value. + */ +int inclusion_proof_v1_set0_identifier(inclusion_proof_v1_t *inp, struct ed25519_v1_st *val); +/** Return the value of the tree_size field of the + * inclusion_proof_v1_t in 'inp' + */ +uint64_t inclusion_proof_v1_get_tree_size(const inclusion_proof_v1_t *inp); +/** Set the value of the tree_size field of the inclusion_proof_v1_t + * in 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int inclusion_proof_v1_set_tree_size(inclusion_proof_v1_t *inp, uint64_t val); +/** Return the value of the leaf_index field of the + * inclusion_proof_v1_t in 'inp' + */ +uint64_t inclusion_proof_v1_get_leaf_index(const inclusion_proof_v1_t *inp); +/** Set the value of the leaf_index field of the inclusion_proof_v1_t + * in 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int inclusion_proof_v1_set_leaf_index(inclusion_proof_v1_t *inp, uint64_t val); +/** Return the value of the length field of the inclusion_proof_v1_t + * in 'inp' + */ +uint64_t inclusion_proof_v1_get_length(const inclusion_proof_v1_t *inp); +/** Set the value of the length field of the inclusion_proof_v1_t in + * 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int inclusion_proof_v1_set_length(inclusion_proof_v1_t *inp, uint64_t val); +/** Return the length of the dynamic array holding the hashes field of + * the inclusion_proof_v1_t in 'inp'. + */ +size_t inclusion_proof_v1_getlen_hashes(const inclusion_proof_v1_t *inp); +/** Return the element at position 'idx' of the dynamic array field + * hashes of the inclusion_proof_v1_t in 'inp'. + */ +uint8_t inclusion_proof_v1_get_hashes(inclusion_proof_v1_t *inp, size_t idx); +/** As inclusion_proof_v1_get_hashes, but take and return a const + * pointer + */ +uint8_t inclusion_proof_v1_getconst_hashes(const inclusion_proof_v1_t *inp, size_t idx); +/** Change the element at position 'idx' of the dynamic array field + * hashes of the inclusion_proof_v1_t in 'inp', so that it will hold + * the value 'elt'. + */ +int inclusion_proof_v1_set_hashes(inclusion_proof_v1_t *inp, size_t idx, uint8_t elt); +/** Append a new element 'elt' to the dynamic array field hashes of + * the inclusion_proof_v1_t in 'inp'. + */ +int inclusion_proof_v1_add_hashes(inclusion_proof_v1_t *inp, uint8_t elt); +/** Return a pointer to the variable-length array field hashes of + * 'inp'. + */ +uint8_t * inclusion_proof_v1_getarray_hashes(inclusion_proof_v1_t *inp); +/** As inclusion_proof_v1_get_hashes, but take and return a const + * pointer + */ +const uint8_t  * inclusion_proof_v1_getconstarray_hashes(const inclusion_proof_v1_t *inp); +/** Change the length of the variable-length array field hashes of + * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; + * return -1 and set the error code on 'inp' on failure. + */ +int inclusion_proof_v1_setlen_hashes(inclusion_proof_v1_t *inp, size_t newlen); +/** Return a newly allocated request_v1 with all elements set to zero. + */ +request_v1_t *request_v1_new(void); +/** Release all storage held by the request_v1 in 'victim'. (Do + * nothing if 'victim' is NULL.) + */ +void request_v1_free(request_v1_t *victim); +/** Try to parse a request_v1 from the buffer in 'input', using up to + * 'len_in' bytes from the input buffer. On success, return the number + * of bytes consumed and set *output to the newly allocated + * request_v1_t. On failure, return -2 if the input appears truncated, + * and -1 if the input is otherwise invalid. + */ +ssize_t request_v1_parse(request_v1_t **output, const uint8_t *input, const size_t len_in); +/** Return the number of bytes we expect to need to encode the + * request_v1 in 'obj'. On failure, return a negative value. Note that + * this value may be an overestimate, and can even be an underestimate + * for certain unencodeable objects. + */ +ssize_t request_v1_encoded_len(const request_v1_t *obj); +/** Try to encode the request_v1 from 'input' into the buffer at + * 'output', using up to 'avail' bytes of the output buffer. On + * success, return the number of bytes used. On failure, return -2 if + * the buffer was not long enough, and -1 if the input was invalid. + */ +ssize_t request_v1_encode(uint8_t *output, size_t avail, const request_v1_t *input); +/** Check whether the internal state of the request_v1 in 'obj' is + * consistent. Return NULL if it is, and a short message if it is not. + */ +const char *request_v1_check(const request_v1_t *obj); +/** Clear any errors that were set on the object 'obj' by its setter + * functions. Return true iff errors were cleared. + */ +int request_v1_clear_errors(request_v1_t *obj); +/** Return the value of the format field of the request_v1_t in 'inp' + */ +uint64_t request_v1_get_format(const request_v1_t *inp); +/** Set the value of the format field of the request_v1_t in 'inp' to + * 'val'. Return 0 on success; return -1 and set the error code on + * 'inp' on failure. + */ +int request_v1_set_format(request_v1_t *inp, uint64_t val); +/** Return the value of the request_get_entries field of the + * request_v1_t in 'inp' + */ +struct req_get_entries_v1_st * request_v1_get_request_get_entries(request_v1_t *inp); +/** As request_v1_get_request_get_entries, but take and return a const + * pointer + */ +const struct req_get_entries_v1_st * request_v1_getconst_request_get_entries(const request_v1_t *inp); +/** Set the value of the request_get_entries field of the request_v1_t + * in 'inp' to 'val'. Free the old value if any. Steals the + * referenceto 'val'.Return 0 on success; return -1 and set the error + * code on 'inp' on failure. + */ +int request_v1_set_request_get_entries(request_v1_t *inp, struct req_get_entries_v1_st *val); +/** As request_v1_set_request_get_entries, but does not free the + * previous value. + */ +int request_v1_set0_request_get_entries(request_v1_t *inp, struct req_get_entries_v1_st *val); +/** Return the value of the request_get_proof_by_hash field of the + * request_v1_t in 'inp' + */ +struct req_get_proof_by_hash_v1_st * request_v1_get_request_get_proof_by_hash(request_v1_t *inp); +/** As request_v1_get_request_get_proof_by_hash, but take and return a + * const pointer + */ +const struct req_get_proof_by_hash_v1_st * request_v1_getconst_request_get_proof_by_hash(const request_v1_t *inp); +/** Set the value of the request_get_proof_by_hash field of the + * request_v1_t in 'inp' to 'val'. Free the old value if any. Steals + * the referenceto 'val'.Return 0 on success; return -1 and set the + * error code on 'inp' on failure. + */ +int request_v1_set_request_get_proof_by_hash(request_v1_t *inp, struct req_get_proof_by_hash_v1_st *val); +/** As request_v1_set_request_get_proof_by_hash, but does not free the + * previous value. + */ +int request_v1_set0_request_get_proof_by_hash(request_v1_t *inp, struct req_get_proof_by_hash_v1_st *val); +/** Return the value of the request_get_consistency_proof field of the + * request_v1_t in 'inp' + */ +struct req_get_consistency_proof_v1_st * request_v1_get_request_get_consistency_proof(request_v1_t *inp); +/** As request_v1_get_request_get_consistency_proof, but take and + * return a const pointer + */ +const struct req_get_consistency_proof_v1_st * request_v1_getconst_request_get_consistency_proof(const request_v1_t *inp); +/** Set the value of the request_get_consistency_proof field of the + * request_v1_t in 'inp' to 'val'. Free the old value if any. Steals + * the referenceto 'val'.Return 0 on success; return -1 and set the + * error code on 'inp' on failure. + */ +int request_v1_set_request_get_consistency_proof(request_v1_t *inp, struct req_get_consistency_proof_v1_st *val); +/** As request_v1_set_request_get_consistency_proof, but does not free + * the previous value. + */ +int request_v1_set0_request_get_consistency_proof(request_v1_t *inp, struct req_get_consistency_proof_v1_st *val); +/** Return a newly allocated signed_checksum32_ed25519_v1 with all + * elements set to zero. + */ +signed_checksum32_ed25519_v1_t *signed_checksum32_ed25519_v1_new(void); +/** Release all storage held by the signed_checksum32_ed25519_v1 in + * 'victim'. (Do nothing if 'victim' is NULL.) + */ +void signed_checksum32_ed25519_v1_free(signed_checksum32_ed25519_v1_t *victim); +/** Try to parse a signed_checksum32_ed25519_v1 from the buffer in + * 'input', using up to 'len_in' bytes from the input buffer. On + * success, return the number of bytes consumed and set *output to the + * newly allocated signed_checksum32_ed25519_v1_t. On failure, return + * -2 if the input appears truncated, and -1 if the input is otherwise + * invalid. + */ +ssize_t signed_checksum32_ed25519_v1_parse(signed_checksum32_ed25519_v1_t **output, const uint8_t *input, const size_t len_in); +/** Return the number of bytes we expect to need to encode the + * signed_checksum32_ed25519_v1 in 'obj'. On failure, return a + * negative value. Note that this value may be an overestimate, and + * can even be an underestimate for certain unencodeable objects. + */ +ssize_t signed_checksum32_ed25519_v1_encoded_len(const signed_checksum32_ed25519_v1_t *obj); +/** Try to encode the signed_checksum32_ed25519_v1 from 'input' into + * the buffer at 'output', using up to 'avail' bytes of the output + * buffer. On success, return the number of bytes used. On failure, + * return -2 if the buffer was not long enough, and -1 if the input + * was invalid. + */ +ssize_t signed_checksum32_ed25519_v1_encode(uint8_t *output, size_t avail, const signed_checksum32_ed25519_v1_t *input); +/** Check whether the internal state of the + * signed_checksum32_ed25519_v1 in 'obj' is consistent. Return NULL if + * it is, and a short message if it is not. + */ +const char *signed_checksum32_ed25519_v1_check(const signed_checksum32_ed25519_v1_t *obj); +/** Clear any errors that were set on the object 'obj' by its setter + * functions. Return true iff errors were cleared. + */ +int signed_checksum32_ed25519_v1_clear_errors(signed_checksum32_ed25519_v1_t *obj); +/** Return the value of the format field of the + * signed_checksum32_ed25519_v1_t in 'inp' + */ +uint64_t signed_checksum32_ed25519_v1_get_format(const signed_checksum32_ed25519_v1_t *inp); +/** Set the value of the format field of the + * signed_checksum32_ed25519_v1_t in 'inp' to 'val'. Return 0 on + * success; return -1 and set the error code on 'inp' on failure. + */ +int signed_checksum32_ed25519_v1_set_format(signed_checksum32_ed25519_v1_t *inp, uint64_t val); +/** Return the (constant) length of the array holding the checksum + * field of the signed_checksum32_ed25519_v1_t in 'inp'. + */ +size_t signed_checksum32_ed25519_v1_getlen_checksum(const signed_checksum32_ed25519_v1_t *inp); +/** Return the element at position 'idx' of the fixed array field + * checksum of the signed_checksum32_ed25519_v1_t in 'inp'. + */ +uint8_t signed_checksum32_ed25519_v1_get_checksum(signed_checksum32_ed25519_v1_t *inp, size_t idx); +/** As signed_checksum32_ed25519_v1_get_checksum, but take and return + * a const pointer + */ +uint8_t signed_checksum32_ed25519_v1_getconst_checksum(const signed_checksum32_ed25519_v1_t *inp, size_t idx); +/** Change the element at position 'idx' of the fixed array field + * checksum of the signed_checksum32_ed25519_v1_t in 'inp', so that it + * will hold the value 'elt'. + */ +int signed_checksum32_ed25519_v1_set_checksum(signed_checksum32_ed25519_v1_t *inp, size_t idx, uint8_t elt); +/** Return a pointer to the 32-element array field checksum of 'inp'. + */ +uint8_t * signed_checksum32_ed25519_v1_getarray_checksum(signed_checksum32_ed25519_v1_t *inp); +/** As signed_checksum32_ed25519_v1_get_checksum, but take and return + * a const pointer + */ +const uint8_t  * signed_checksum32_ed25519_v1_getconstarray_checksum(const signed_checksum32_ed25519_v1_t *inp); +/** Return the value of the length field of the + * signed_checksum32_ed25519_v1_t in 'inp' + */ +uint64_t signed_checksum32_ed25519_v1_get_length(const signed_checksum32_ed25519_v1_t *inp); +/** Set the value of the length field of the + * signed_checksum32_ed25519_v1_t in 'inp' to 'val'. Return 0 on + * success; return -1 and set the error code on 'inp' on failure. + */ +int signed_checksum32_ed25519_v1_set_length(signed_checksum32_ed25519_v1_t *inp, uint64_t val); +/** Return the length of the dynamic array holding the identifier + * field of the signed_checksum32_ed25519_v1_t in 'inp'. + */ +size_t signed_checksum32_ed25519_v1_getlen_identifier(const signed_checksum32_ed25519_v1_t *inp); +/** Return the element at position 'idx' of the dynamic array field + * identifier of the signed_checksum32_ed25519_v1_t in 'inp'. + */ +uint8_t signed_checksum32_ed25519_v1_get_identifier(signed_checksum32_ed25519_v1_t *inp, size_t idx); +/** As signed_checksum32_ed25519_v1_get_identifier, but take and + * return a const pointer + */ +uint8_t signed_checksum32_ed25519_v1_getconst_identifier(const signed_checksum32_ed25519_v1_t *inp, size_t idx); +/** Change the element at position 'idx' of the dynamic array field + * identifier of the signed_checksum32_ed25519_v1_t in 'inp', so that + * it will hold the value 'elt'. + */ +int signed_checksum32_ed25519_v1_set_identifier(signed_checksum32_ed25519_v1_t *inp, size_t idx, uint8_t elt); +/** Append a new element 'elt' to the dynamic array field identifier + * of the signed_checksum32_ed25519_v1_t in 'inp'. + */ +int signed_checksum32_ed25519_v1_add_identifier(signed_checksum32_ed25519_v1_t *inp, uint8_t elt); +/** Return a pointer to the variable-length array field identifier of + * 'inp'. + */ +uint8_t * signed_checksum32_ed25519_v1_getarray_identifier(signed_checksum32_ed25519_v1_t *inp); +/** As signed_checksum32_ed25519_v1_get_identifier, but take and + * return a const pointer + */ +const uint8_t  * signed_checksum32_ed25519_v1_getconstarray_identifier(const signed_checksum32_ed25519_v1_t *inp); +/** Change the length of the variable-length array field identifier of + * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; + * return -1 and set the error code on 'inp' on failure. + */ +int signed_checksum32_ed25519_v1_setlen_identifier(signed_checksum32_ed25519_v1_t *inp, size_t newlen); +/** Return the (constant) length of the array holding the signature + * field of the signed_checksum32_ed25519_v1_t in 'inp'. + */ +size_t signed_checksum32_ed25519_v1_getlen_signature(const signed_checksum32_ed25519_v1_t *inp); +/** Return the element at position 'idx' of the fixed array field + * signature of the signed_checksum32_ed25519_v1_t in 'inp'. + */ +uint8_t signed_checksum32_ed25519_v1_get_signature(signed_checksum32_ed25519_v1_t *inp, size_t idx); +/** As signed_checksum32_ed25519_v1_get_signature, but take and return + * a const pointer + */ +uint8_t signed_checksum32_ed25519_v1_getconst_signature(const signed_checksum32_ed25519_v1_t *inp, size_t idx); +/** Change the element at position 'idx' of the fixed array field + * signature of the signed_checksum32_ed25519_v1_t in 'inp', so that + * it will hold the value 'elt'. + */ +int signed_checksum32_ed25519_v1_set_signature(signed_checksum32_ed25519_v1_t *inp, size_t idx, uint8_t elt); +/** Return a pointer to the 64-element array field signature of 'inp'. + */ +uint8_t * signed_checksum32_ed25519_v1_getarray_signature(signed_checksum32_ed25519_v1_t *inp); +/** As signed_checksum32_ed25519_v1_get_signature, but take and return + * a const pointer + */ +const uint8_t  * signed_checksum32_ed25519_v1_getconstarray_signature(const signed_checksum32_ed25519_v1_t *inp); +/** Return the value of the namespace field of the + * signed_checksum32_ed25519_v1_t in 'inp' + */ +struct ed25519_v1_st * signed_checksum32_ed25519_v1_get_namespace(signed_checksum32_ed25519_v1_t *inp); +/** As signed_checksum32_ed25519_v1_get_namespace, but take and return + * a const pointer + */ +const struct ed25519_v1_st * signed_checksum32_ed25519_v1_getconst_namespace(const signed_checksum32_ed25519_v1_t *inp); +/** Set the value of the namespace field of the + * signed_checksum32_ed25519_v1_t in 'inp' to 'val'. Free the old + * value if any. Steals the referenceto 'val'.Return 0 on success; + * return -1 and set the error code on 'inp' on failure. + */ +int signed_checksum32_ed25519_v1_set_namespace(signed_checksum32_ed25519_v1_t *inp, struct ed25519_v1_st *val); +/** As signed_checksum32_ed25519_v1_set_namespace, but does not free + * the previous value. + */ +int signed_checksum32_ed25519_v1_set0_namespace(signed_checksum32_ed25519_v1_t *inp, struct ed25519_v1_st *val); + + +#endif diff --git a/trunnel/stfe.trunnel b/trunnel/stfe.trunnel new file mode 100644 index 0000000..eb82942 --- /dev/null +++ b/trunnel/stfe.trunnel @@ -0,0 +1,85 @@ +const T_GET_ENTRIES_V1 = 1; +const T_GET_PROOF_BY_HASH_V1 = 2; +const T_GET_CONSISTENCY_PROOF_V1 = 3; +const T_INCLUSION_PROOF_V1 = 4; +const T_CONSISTENCY_PROOF_V1 = 5; +const T_SIGNED_TREE_HEAD_V1 = 6; +const T_SIGNED_CHECKSUM32_ED25519_V1 = 7; +const T_ED25519_V1 = 8; + +struct req_get_entries_v1 { +  u64 start_size; +  u64 end_size; +}; + +struct req_get_proof_by_hash_v1 { +  u64 tree_size; +  u8 leaf_hash[32]; +}; + +struct req_get_consistency_proof_v1 { +  u64 old_size; +  u64 new_size; +}; + +struct request_v1 { +  u64 format IN [ T_GET_ENTRIES_V1, T_GET_PROOF_BY_HASH_V1, T_GET_CONSISTENCY_PROOF_V1 ]; + +  union request[format] { +    T_GET_ENTRIES_V1: struct req_get_entries_v1 get_entries; +    T_GET_PROOF_BY_HASH_V1: struct req_get_proof_by_hash_v1 get_proof_by_hash; +    T_GET_CONSISTENCY_PROOF_V1: struct req_get_consistency_proof_v1 get_consistency_proof; +    default: fail; +  }; +}	     + +struct inclusion_proof_v1 { +  u64 format IN [ T_INCLUSION_PROOF_V1 ]; +  struct ed25519_v1 identifier; +  u64 tree_size; +  u64 leaf_index; +  u64 length; /* TODO: constraint: multiple of 32 */ +  u8 hashes[length];   +}; + +struct consistency_proof_v1 { +  u64 format IN [ T_CONSISTENCY_PROOF_V1 ]; +  struct ed25519_v1 identifier; +  u64 old_size; +  u64 new_size; +  u64 length; /* TODO: constraint: multiple of 32 */ +  u8 hashes[length];   +}; + +/* Not used +struct sigident { +  u8 signature[64]; +  struct ed25519_v1 identifier; +}; */ + +struct signed_tree_head_v1 { +  u64 format IN [ T_SIGNED_TREE_HEAD_V1 ]; +  u64 timestamp; +  u64 tree_size; +  u8 root_hash[32]; +  u64 length; /* TODO: constraint: multiple of 104 */ +  u8 sigident[length]; +  /* Alternatively, if we would chose to replace length with n_items: +  u64 n_items; +  struct sigident[n_items]; */ +}; + +struct signed_checksum32_ed25519_v1 { +  u64 format IN [ T_SIGNED_CHECKSUM32_ED25519_V1 ]; +  u8 checksum[32]; +  u64 length IN [ 1..127 ]; /* The spec contradicts itself on this point -- is it 127 or 128? */ +  u8 identifier[length]; +  u8 signature[64]; +  struct ed25519_v1 namespace;   +}; + +struct ed25519_v1 { +  u64 format IN [ T_ED25519_V1 ]; +  u8 pubkey[32]; +}; + | 
