"Fossies" - the Fresh Open Source Software Archive

Member "tor-0.4.1.6/src/trunnel/ed25519_cert.h" (10 Jun 2019, 44113 Bytes) of package /linux/misc/tor-0.4.1.6.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "ed25519_cert.h" see the Fossies "Dox" file reference documentation.

    1 /* ed25519_cert.h -- generated by Trunnel v1.5.2.
    2  * https://gitweb.torproject.org/trunnel.git
    3  * You probably shouldn't edit this file.
    4  */
    5 #ifndef TRUNNEL_ED25519_CERT_H
    6 #define TRUNNEL_ED25519_CERT_H
    7 
    8 #include <stdint.h>
    9 #include "trunnel.h"
   10 
   11 #define CERTEXT_SIGNED_WITH_KEY 4
   12 #define CERTEXT_FLAG_AFFECTS_VALIDATION 1
   13 #define LS_IPV4 0
   14 #define LS_IPV6 1
   15 #define LS_LEGACY_ID 2
   16 #define LS_ED25519_ID 3
   17 #if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CREATE2_CELL_BODY)
   18 struct create2_cell_body_st {
   19   uint16_t handshake_type;
   20   uint16_t handshake_len;
   21   TRUNNEL_DYNARRAY_HEAD(, uint8_t) handshake_data;
   22   uint8_t trunnel_error_code_;
   23 };
   24 #endif
   25 typedef struct create2_cell_body_st create2_cell_body_t;
   26 #if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_ED25519_CERT_EXTENSION)
   27 struct ed25519_cert_extension_st {
   28   uint16_t ext_length;
   29   uint8_t ext_type;
   30   uint8_t ext_flags;
   31   uint8_t un_signing_key[32];
   32   TRUNNEL_DYNARRAY_HEAD(, uint8_t) un_unparsed;
   33   uint8_t trunnel_error_code_;
   34 };
   35 #endif
   36 typedef struct ed25519_cert_extension_st ed25519_cert_extension_t;
   37 #if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_EXTEND1_CELL_BODY)
   38 struct extend1_cell_body_st {
   39   uint32_t ipv4addr;
   40   uint16_t port;
   41   uint8_t onionskin[186];
   42   uint8_t identity[20];
   43   uint8_t trunnel_error_code_;
   44 };
   45 #endif
   46 typedef struct extend1_cell_body_st extend1_cell_body_t;
   47 #if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_LINK_SPECIFIER)
   48 struct link_specifier_st {
   49   uint8_t ls_type;
   50   uint8_t ls_len;
   51   uint32_t un_ipv4_addr;
   52   uint16_t un_ipv4_port;
   53   uint8_t un_ipv6_addr[16];
   54   uint16_t un_ipv6_port;
   55   uint8_t un_legacy_id[20];
   56   uint8_t un_ed25519_id[32];
   57   TRUNNEL_DYNARRAY_HEAD(, uint8_t) un_unrecognized;
   58   uint8_t trunnel_error_code_;
   59 };
   60 #endif
   61 typedef struct link_specifier_st link_specifier_t;
   62 #if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_ED25519_CERT)
   63 struct ed25519_cert_st {
   64   uint8_t version;
   65   uint8_t cert_type;
   66   uint32_t exp_field;
   67   uint8_t cert_key_type;
   68   uint8_t certified_key[32];
   69   uint8_t n_extensions;
   70   TRUNNEL_DYNARRAY_HEAD(, struct ed25519_cert_extension_st *) ext;
   71   uint8_t signature[64];
   72   uint8_t trunnel_error_code_;
   73 };
   74 #endif
   75 typedef struct ed25519_cert_st ed25519_cert_t;
   76 #if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_EXTEND2_CELL_BODY)
   77 struct extend2_cell_body_st {
   78   uint8_t n_spec;
   79   TRUNNEL_DYNARRAY_HEAD(, struct link_specifier_st *) ls;
   80   struct create2_cell_body_st *create2;
   81   uint8_t trunnel_error_code_;
   82 };
   83 #endif
   84 typedef struct extend2_cell_body_st extend2_cell_body_t;
   85 #if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_LINK_SPECIFIER_LIST)
   86 struct link_specifier_list_st {
   87   uint8_t n_spec;
   88   TRUNNEL_DYNARRAY_HEAD(, struct link_specifier_st *) spec;
   89   uint8_t trunnel_error_code_;
   90 };
   91 #endif
   92 typedef struct link_specifier_list_st link_specifier_list_t;
   93 /** Return a newly allocated create2_cell_body with all elements set
   94  * to zero.
   95  */
   96 create2_cell_body_t *create2_cell_body_new(void);
   97 /** Release all storage held by the create2_cell_body in 'victim'. (Do
   98  * nothing if 'victim' is NULL.)
   99  */
  100 void create2_cell_body_free(create2_cell_body_t *victim);
  101 /** Try to parse a create2_cell_body from the buffer in 'input', using
  102  * up to 'len_in' bytes from the input buffer. On success, return the
  103  * number of bytes consumed and set *output to the newly allocated
  104  * create2_cell_body_t. On failure, return -2 if the input appears
  105  * truncated, and -1 if the input is otherwise invalid.
  106  */
  107 ssize_t create2_cell_body_parse(create2_cell_body_t **output, const uint8_t *input, const size_t len_in);
  108 /** Return the number of bytes we expect to need to encode the
  109  * create2_cell_body in 'obj'. On failure, return a negative value.
  110  * Note that this value may be an overestimate, and can even be an
  111  * underestimate for certain unencodeable objects.
  112  */
  113 ssize_t create2_cell_body_encoded_len(const create2_cell_body_t *obj);
  114 /** Try to encode the create2_cell_body from 'input' into the buffer
  115  * at 'output', using up to 'avail' bytes of the output buffer. On
  116  * success, return the number of bytes used. On failure, return -2 if
  117  * the buffer was not long enough, and -1 if the input was invalid.
  118  */
  119 ssize_t create2_cell_body_encode(uint8_t *output, size_t avail, const create2_cell_body_t *input);
  120 /** Check whether the internal state of the create2_cell_body in 'obj'
  121  * is consistent. Return NULL if it is, and a short message if it is
  122  * not.
  123  */
  124 const char *create2_cell_body_check(const create2_cell_body_t *obj);
  125 /** Clear any errors that were set on the object 'obj' by its setter
  126  * functions. Return true iff errors were cleared.
  127  */
  128 int create2_cell_body_clear_errors(create2_cell_body_t *obj);
  129 /** Return the value of the handshake_type field of the
  130  * create2_cell_body_t in 'inp'
  131  */
  132 uint16_t create2_cell_body_get_handshake_type(const create2_cell_body_t *inp);
  133 /** Set the value of the handshake_type field of the
  134  * create2_cell_body_t in 'inp' to 'val'. Return 0 on success; return
  135  * -1 and set the error code on 'inp' on failure.
  136  */
  137 int create2_cell_body_set_handshake_type(create2_cell_body_t *inp, uint16_t val);
  138 /** Return the value of the handshake_len field of the
  139  * create2_cell_body_t in 'inp'
  140  */
  141 uint16_t create2_cell_body_get_handshake_len(const create2_cell_body_t *inp);
  142 /** Set the value of the handshake_len field of the
  143  * create2_cell_body_t in 'inp' to 'val'. Return 0 on success; return
  144  * -1 and set the error code on 'inp' on failure.
  145  */
  146 int create2_cell_body_set_handshake_len(create2_cell_body_t *inp, uint16_t val);
  147 /** Return the length of the dynamic array holding the handshake_data
  148  * field of the create2_cell_body_t in 'inp'.
  149  */
  150 size_t create2_cell_body_getlen_handshake_data(const create2_cell_body_t *inp);
  151 /** Return the element at position 'idx' of the dynamic array field
  152  * handshake_data of the create2_cell_body_t in 'inp'.
  153  */
  154 uint8_t create2_cell_body_get_handshake_data(create2_cell_body_t *inp, size_t idx);
  155 /** As create2_cell_body_get_handshake_data, but take and return a
  156  * const pointer
  157  */
  158 uint8_t create2_cell_body_getconst_handshake_data(const create2_cell_body_t *inp, size_t idx);
  159 /** Change the element at position 'idx' of the dynamic array field
  160  * handshake_data of the create2_cell_body_t in 'inp', so that it will
  161  * hold the value 'elt'.
  162  */
  163 int create2_cell_body_set_handshake_data(create2_cell_body_t *inp, size_t idx, uint8_t elt);
  164 /** Append a new element 'elt' to the dynamic array field
  165  * handshake_data of the create2_cell_body_t in 'inp'.
  166  */
  167 int create2_cell_body_add_handshake_data(create2_cell_body_t *inp, uint8_t elt);
  168 /** Return a pointer to the variable-length array field handshake_data
  169  * of 'inp'.
  170  */
  171 uint8_t * create2_cell_body_getarray_handshake_data(create2_cell_body_t *inp);
  172 /** As create2_cell_body_get_handshake_data, but take and return a
  173  * const pointer
  174  */
  175 const uint8_t  * create2_cell_body_getconstarray_handshake_data(const create2_cell_body_t *inp);
  176 /** Change the length of the variable-length array field
  177  * handshake_data of 'inp' to 'newlen'.Fill extra elements with 0.
  178  * Return 0 on success; return -1 and set the error code on 'inp' on
  179  * failure.
  180  */
  181 int create2_cell_body_setlen_handshake_data(create2_cell_body_t *inp, size_t newlen);
  182 /** Return a newly allocated ed25519_cert_extension with all elements
  183  * set to zero.
  184  */
  185 ed25519_cert_extension_t *ed25519_cert_extension_new(void);
  186 /** Release all storage held by the ed25519_cert_extension in
  187  * 'victim'. (Do nothing if 'victim' is NULL.)
  188  */
  189 void ed25519_cert_extension_free(ed25519_cert_extension_t *victim);
  190 /** Try to parse a ed25519_cert_extension from the buffer in 'input',
  191  * using up to 'len_in' bytes from the input buffer. On success,
  192  * return the number of bytes consumed and set *output to the newly
  193  * allocated ed25519_cert_extension_t. On failure, return -2 if the
  194  * input appears truncated, and -1 if the input is otherwise invalid.
  195  */
  196 ssize_t ed25519_cert_extension_parse(ed25519_cert_extension_t **output, const uint8_t *input, const size_t len_in);
  197 /** Return the number of bytes we expect to need to encode the
  198  * ed25519_cert_extension in 'obj'. On failure, return a negative
  199  * value. Note that this value may be an overestimate, and can even be
  200  * an underestimate for certain unencodeable objects.
  201  */
  202 ssize_t ed25519_cert_extension_encoded_len(const ed25519_cert_extension_t *obj);
  203 /** Try to encode the ed25519_cert_extension from 'input' into the
  204  * buffer at 'output', using up to 'avail' bytes of the output buffer.
  205  * On success, return the number of bytes used. On failure, return -2
  206  * if the buffer was not long enough, and -1 if the input was invalid.
  207  */
  208 ssize_t ed25519_cert_extension_encode(uint8_t *output, size_t avail, const ed25519_cert_extension_t *input);
  209 /** Check whether the internal state of the ed25519_cert_extension in
  210  * 'obj' is consistent. Return NULL if it is, and a short message if
  211  * it is not.
  212  */
  213 const char *ed25519_cert_extension_check(const ed25519_cert_extension_t *obj);
  214 /** Clear any errors that were set on the object 'obj' by its setter
  215  * functions. Return true iff errors were cleared.
  216  */
  217 int ed25519_cert_extension_clear_errors(ed25519_cert_extension_t *obj);
  218 /** Return the value of the ext_length field of the
  219  * ed25519_cert_extension_t in 'inp'
  220  */
  221 uint16_t ed25519_cert_extension_get_ext_length(const ed25519_cert_extension_t *inp);
  222 /** Set the value of the ext_length field of the
  223  * ed25519_cert_extension_t in 'inp' to 'val'. Return 0 on success;
  224  * return -1 and set the error code on 'inp' on failure.
  225  */
  226 int ed25519_cert_extension_set_ext_length(ed25519_cert_extension_t *inp, uint16_t val);
  227 /** Return the value of the ext_type field of the
  228  * ed25519_cert_extension_t in 'inp'
  229  */
  230 uint8_t ed25519_cert_extension_get_ext_type(const ed25519_cert_extension_t *inp);
  231 /** Set the value of the ext_type field of the
  232  * ed25519_cert_extension_t in 'inp' to 'val'. Return 0 on success;
  233  * return -1 and set the error code on 'inp' on failure.
  234  */
  235 int ed25519_cert_extension_set_ext_type(ed25519_cert_extension_t *inp, uint8_t val);
  236 /** Return the value of the ext_flags field of the
  237  * ed25519_cert_extension_t in 'inp'
  238  */
  239 uint8_t ed25519_cert_extension_get_ext_flags(const ed25519_cert_extension_t *inp);
  240 /** Set the value of the ext_flags field of the
  241  * ed25519_cert_extension_t in 'inp' to 'val'. Return 0 on success;
  242  * return -1 and set the error code on 'inp' on failure.
  243  */
  244 int ed25519_cert_extension_set_ext_flags(ed25519_cert_extension_t *inp, uint8_t val);
  245 /** Return the (constant) length of the array holding the
  246  * un_signing_key field of the ed25519_cert_extension_t in 'inp'.
  247  */
  248 size_t ed25519_cert_extension_getlen_un_signing_key(const ed25519_cert_extension_t *inp);
  249 /** Return the element at position 'idx' of the fixed array field
  250  * un_signing_key of the ed25519_cert_extension_t in 'inp'.
  251  */
  252 uint8_t ed25519_cert_extension_get_un_signing_key(ed25519_cert_extension_t *inp, size_t idx);
  253 /** As ed25519_cert_extension_get_un_signing_key, but take and return
  254  * a const pointer
  255  */
  256 uint8_t ed25519_cert_extension_getconst_un_signing_key(const ed25519_cert_extension_t *inp, size_t idx);
  257 /** Change the element at position 'idx' of the fixed array field
  258  * un_signing_key of the ed25519_cert_extension_t in 'inp', so that it
  259  * will hold the value 'elt'.
  260  */
  261 int ed25519_cert_extension_set_un_signing_key(ed25519_cert_extension_t *inp, size_t idx, uint8_t elt);
  262 /** Return a pointer to the 32-element array field un_signing_key of
  263  * 'inp'.
  264  */
  265 uint8_t * ed25519_cert_extension_getarray_un_signing_key(ed25519_cert_extension_t *inp);
  266 /** As ed25519_cert_extension_get_un_signing_key, but take and return
  267  * a const pointer
  268  */
  269 const uint8_t  * ed25519_cert_extension_getconstarray_un_signing_key(const ed25519_cert_extension_t *inp);
  270 /** Return the length of the dynamic array holding the un_unparsed
  271  * field of the ed25519_cert_extension_t in 'inp'.
  272  */
  273 size_t ed25519_cert_extension_getlen_un_unparsed(const ed25519_cert_extension_t *inp);
  274 /** Return the element at position 'idx' of the dynamic array field
  275  * un_unparsed of the ed25519_cert_extension_t in 'inp'.
  276  */
  277 uint8_t ed25519_cert_extension_get_un_unparsed(ed25519_cert_extension_t *inp, size_t idx);
  278 /** As ed25519_cert_extension_get_un_unparsed, but take and return a
  279  * const pointer
  280  */
  281 uint8_t ed25519_cert_extension_getconst_un_unparsed(const ed25519_cert_extension_t *inp, size_t idx);
  282 /** Change the element at position 'idx' of the dynamic array field
  283  * un_unparsed of the ed25519_cert_extension_t in 'inp', so that it
  284  * will hold the value 'elt'.
  285  */
  286 int ed25519_cert_extension_set_un_unparsed(ed25519_cert_extension_t *inp, size_t idx, uint8_t elt);
  287 /** Append a new element 'elt' to the dynamic array field un_unparsed
  288  * of the ed25519_cert_extension_t in 'inp'.
  289  */
  290 int ed25519_cert_extension_add_un_unparsed(ed25519_cert_extension_t *inp, uint8_t elt);
  291 /** Return a pointer to the variable-length array field un_unparsed of
  292  * 'inp'.
  293  */
  294 uint8_t * ed25519_cert_extension_getarray_un_unparsed(ed25519_cert_extension_t *inp);
  295 /** As ed25519_cert_extension_get_un_unparsed, but take and return a
  296  * const pointer
  297  */
  298 const uint8_t  * ed25519_cert_extension_getconstarray_un_unparsed(const ed25519_cert_extension_t *inp);
  299 /** Change the length of the variable-length array field un_unparsed
  300  * of 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on
  301  * success; return -1 and set the error code on 'inp' on failure.
  302  */
  303 int ed25519_cert_extension_setlen_un_unparsed(ed25519_cert_extension_t *inp, size_t newlen);
  304 /** Return a newly allocated extend1_cell_body with all elements set
  305  * to zero.
  306  */
  307 extend1_cell_body_t *extend1_cell_body_new(void);
  308 /** Release all storage held by the extend1_cell_body in 'victim'. (Do
  309  * nothing if 'victim' is NULL.)
  310  */
  311 void extend1_cell_body_free(extend1_cell_body_t *victim);
  312 /** Try to parse a extend1_cell_body from the buffer in 'input', using
  313  * up to 'len_in' bytes from the input buffer. On success, return the
  314  * number of bytes consumed and set *output to the newly allocated
  315  * extend1_cell_body_t. On failure, return -2 if the input appears
  316  * truncated, and -1 if the input is otherwise invalid.
  317  */
  318 ssize_t extend1_cell_body_parse(extend1_cell_body_t **output, const uint8_t *input, const size_t len_in);
  319 /** Return the number of bytes we expect to need to encode the
  320  * extend1_cell_body in 'obj'. On failure, return a negative value.
  321  * Note that this value may be an overestimate, and can even be an
  322  * underestimate for certain unencodeable objects.
  323  */
  324 ssize_t extend1_cell_body_encoded_len(const extend1_cell_body_t *obj);
  325 /** Try to encode the extend1_cell_body from 'input' into the buffer
  326  * at 'output', using up to 'avail' bytes of the output buffer. On
  327  * success, return the number of bytes used. On failure, return -2 if
  328  * the buffer was not long enough, and -1 if the input was invalid.
  329  */
  330 ssize_t extend1_cell_body_encode(uint8_t *output, size_t avail, const extend1_cell_body_t *input);
  331 /** Check whether the internal state of the extend1_cell_body in 'obj'
  332  * is consistent. Return NULL if it is, and a short message if it is
  333  * not.
  334  */
  335 const char *extend1_cell_body_check(const extend1_cell_body_t *obj);
  336 /** Clear any errors that were set on the object 'obj' by its setter
  337  * functions. Return true iff errors were cleared.
  338  */
  339 int extend1_cell_body_clear_errors(extend1_cell_body_t *obj);
  340 /** Return the value of the ipv4addr field of the extend1_cell_body_t
  341  * in 'inp'
  342  */
  343 uint32_t extend1_cell_body_get_ipv4addr(const extend1_cell_body_t *inp);
  344 /** Set the value of the ipv4addr field of the extend1_cell_body_t in
  345  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  346  * code on 'inp' on failure.
  347  */
  348 int extend1_cell_body_set_ipv4addr(extend1_cell_body_t *inp, uint32_t val);
  349 /** Return the value of the port field of the extend1_cell_body_t in
  350  * 'inp'
  351  */
  352 uint16_t extend1_cell_body_get_port(const extend1_cell_body_t *inp);
  353 /** Set the value of the port field of the extend1_cell_body_t in
  354  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  355  * code on 'inp' on failure.
  356  */
  357 int extend1_cell_body_set_port(extend1_cell_body_t *inp, uint16_t val);
  358 /** Return the (constant) length of the array holding the onionskin
  359  * field of the extend1_cell_body_t in 'inp'.
  360  */
  361 size_t extend1_cell_body_getlen_onionskin(const extend1_cell_body_t *inp);
  362 /** Return the element at position 'idx' of the fixed array field
  363  * onionskin of the extend1_cell_body_t in 'inp'.
  364  */
  365 uint8_t extend1_cell_body_get_onionskin(extend1_cell_body_t *inp, size_t idx);
  366 /** As extend1_cell_body_get_onionskin, but take and return a const
  367  * pointer
  368  */
  369 uint8_t extend1_cell_body_getconst_onionskin(const extend1_cell_body_t *inp, size_t idx);
  370 /** Change the element at position 'idx' of the fixed array field
  371  * onionskin of the extend1_cell_body_t in 'inp', so that it will hold
  372  * the value 'elt'.
  373  */
  374 int extend1_cell_body_set_onionskin(extend1_cell_body_t *inp, size_t idx, uint8_t elt);
  375 /** Return a pointer to the 186-element array field onionskin of
  376  * 'inp'.
  377  */
  378 uint8_t * extend1_cell_body_getarray_onionskin(extend1_cell_body_t *inp);
  379 /** As extend1_cell_body_get_onionskin, but take and return a const
  380  * pointer
  381  */
  382 const uint8_t  * extend1_cell_body_getconstarray_onionskin(const extend1_cell_body_t *inp);
  383 /** Return the (constant) length of the array holding the identity
  384  * field of the extend1_cell_body_t in 'inp'.
  385  */
  386 size_t extend1_cell_body_getlen_identity(const extend1_cell_body_t *inp);
  387 /** Return the element at position 'idx' of the fixed array field
  388  * identity of the extend1_cell_body_t in 'inp'.
  389  */
  390 uint8_t extend1_cell_body_get_identity(extend1_cell_body_t *inp, size_t idx);
  391 /** As extend1_cell_body_get_identity, but take and return a const
  392  * pointer
  393  */
  394 uint8_t extend1_cell_body_getconst_identity(const extend1_cell_body_t *inp, size_t idx);
  395 /** Change the element at position 'idx' of the fixed array field
  396  * identity of the extend1_cell_body_t in 'inp', so that it will hold
  397  * the value 'elt'.
  398  */
  399 int extend1_cell_body_set_identity(extend1_cell_body_t *inp, size_t idx, uint8_t elt);
  400 /** Return a pointer to the 20-element array field identity of 'inp'.
  401  */
  402 uint8_t * extend1_cell_body_getarray_identity(extend1_cell_body_t *inp);
  403 /** As extend1_cell_body_get_identity, but take and return a const
  404  * pointer
  405  */
  406 const uint8_t  * extend1_cell_body_getconstarray_identity(const extend1_cell_body_t *inp);
  407 /** Return a newly allocated link_specifier with all elements set to
  408  * zero.
  409  */
  410 link_specifier_t *link_specifier_new(void);
  411 /** Release all storage held by the link_specifier in 'victim'. (Do
  412  * nothing if 'victim' is NULL.)
  413  */
  414 void link_specifier_free(link_specifier_t *victim);
  415 /** Try to parse a link_specifier from the buffer in 'input', using up
  416  * to 'len_in' bytes from the input buffer. On success, return the
  417  * number of bytes consumed and set *output to the newly allocated
  418  * link_specifier_t. On failure, return -2 if the input appears
  419  * truncated, and -1 if the input is otherwise invalid.
  420  */
  421 ssize_t link_specifier_parse(link_specifier_t **output, const uint8_t *input, const size_t len_in);
  422 /** Return the number of bytes we expect to need to encode the
  423  * link_specifier in 'obj'. On failure, return a negative value. Note
  424  * that this value may be an overestimate, and can even be an
  425  * underestimate for certain unencodeable objects.
  426  */
  427 ssize_t link_specifier_encoded_len(const link_specifier_t *obj);
  428 /** Try to encode the link_specifier from 'input' into the buffer at
  429  * 'output', using up to 'avail' bytes of the output buffer. On
  430  * success, return the number of bytes used. On failure, return -2 if
  431  * the buffer was not long enough, and -1 if the input was invalid.
  432  */
  433 ssize_t link_specifier_encode(uint8_t *output, size_t avail, const link_specifier_t *input);
  434 /** Check whether the internal state of the link_specifier in 'obj' is
  435  * consistent. Return NULL if it is, and a short message if it is not.
  436  */
  437 const char *link_specifier_check(const link_specifier_t *obj);
  438 /** Clear any errors that were set on the object 'obj' by its setter
  439  * functions. Return true iff errors were cleared.
  440  */
  441 int link_specifier_clear_errors(link_specifier_t *obj);
  442 /** Return the value of the ls_type field of the link_specifier_t in
  443  * 'inp'
  444  */
  445 uint8_t link_specifier_get_ls_type(const link_specifier_t *inp);
  446 /** Set the value of the ls_type field of the link_specifier_t in
  447  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  448  * code on 'inp' on failure.
  449  */
  450 int link_specifier_set_ls_type(link_specifier_t *inp, uint8_t val);
  451 /** Return the value of the ls_len field of the link_specifier_t in
  452  * 'inp'
  453  */
  454 uint8_t link_specifier_get_ls_len(const link_specifier_t *inp);
  455 /** Set the value of the ls_len field of the link_specifier_t in 'inp'
  456  * to 'val'. Return 0 on success; return -1 and set the error code on
  457  * 'inp' on failure.
  458  */
  459 int link_specifier_set_ls_len(link_specifier_t *inp, uint8_t val);
  460 /** Return the value of the un_ipv4_addr field of the link_specifier_t
  461  * in 'inp'
  462  */
  463 uint32_t link_specifier_get_un_ipv4_addr(const link_specifier_t *inp);
  464 /** Set the value of the un_ipv4_addr field of the link_specifier_t in
  465  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  466  * code on 'inp' on failure.
  467  */
  468 int link_specifier_set_un_ipv4_addr(link_specifier_t *inp, uint32_t val);
  469 /** Return the value of the un_ipv4_port field of the link_specifier_t
  470  * in 'inp'
  471  */
  472 uint16_t link_specifier_get_un_ipv4_port(const link_specifier_t *inp);
  473 /** Set the value of the un_ipv4_port field of the link_specifier_t in
  474  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  475  * code on 'inp' on failure.
  476  */
  477 int link_specifier_set_un_ipv4_port(link_specifier_t *inp, uint16_t val);
  478 /** Return the (constant) length of the array holding the un_ipv6_addr
  479  * field of the link_specifier_t in 'inp'.
  480  */
  481 size_t link_specifier_getlen_un_ipv6_addr(const link_specifier_t *inp);
  482 /** Return the element at position 'idx' of the fixed array field
  483  * un_ipv6_addr of the link_specifier_t in 'inp'.
  484  */
  485 uint8_t link_specifier_get_un_ipv6_addr(link_specifier_t *inp, size_t idx);
  486 /** As link_specifier_get_un_ipv6_addr, but take and return a const
  487  * pointer
  488  */
  489 uint8_t link_specifier_getconst_un_ipv6_addr(const link_specifier_t *inp, size_t idx);
  490 /** Change the element at position 'idx' of the fixed array field
  491  * un_ipv6_addr of the link_specifier_t in 'inp', so that it will hold
  492  * the value 'elt'.
  493  */
  494 int link_specifier_set_un_ipv6_addr(link_specifier_t *inp, size_t idx, uint8_t elt);
  495 /** Return a pointer to the 16-element array field un_ipv6_addr of
  496  * 'inp'.
  497  */
  498 uint8_t * link_specifier_getarray_un_ipv6_addr(link_specifier_t *inp);
  499 /** As link_specifier_get_un_ipv6_addr, but take and return a const
  500  * pointer
  501  */
  502 const uint8_t  * link_specifier_getconstarray_un_ipv6_addr(const link_specifier_t *inp);
  503 /** Return the value of the un_ipv6_port field of the link_specifier_t
  504  * in 'inp'
  505  */
  506 uint16_t link_specifier_get_un_ipv6_port(const link_specifier_t *inp);
  507 /** Set the value of the un_ipv6_port field of the link_specifier_t in
  508  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  509  * code on 'inp' on failure.
  510  */
  511 int link_specifier_set_un_ipv6_port(link_specifier_t *inp, uint16_t val);
  512 /** Return the (constant) length of the array holding the un_legacy_id
  513  * field of the link_specifier_t in 'inp'.
  514  */
  515 size_t link_specifier_getlen_un_legacy_id(const link_specifier_t *inp);
  516 /** Return the element at position 'idx' of the fixed array field
  517  * un_legacy_id of the link_specifier_t in 'inp'.
  518  */
  519 uint8_t link_specifier_get_un_legacy_id(link_specifier_t *inp, size_t idx);
  520 /** As link_specifier_get_un_legacy_id, but take and return a const
  521  * pointer
  522  */
  523 uint8_t link_specifier_getconst_un_legacy_id(const link_specifier_t *inp, size_t idx);
  524 /** Change the element at position 'idx' of the fixed array field
  525  * un_legacy_id of the link_specifier_t in 'inp', so that it will hold
  526  * the value 'elt'.
  527  */
  528 int link_specifier_set_un_legacy_id(link_specifier_t *inp, size_t idx, uint8_t elt);
  529 /** Return a pointer to the 20-element array field un_legacy_id of
  530  * 'inp'.
  531  */
  532 uint8_t * link_specifier_getarray_un_legacy_id(link_specifier_t *inp);
  533 /** As link_specifier_get_un_legacy_id, but take and return a const
  534  * pointer
  535  */
  536 const uint8_t  * link_specifier_getconstarray_un_legacy_id(const link_specifier_t *inp);
  537 /** Return the (constant) length of the array holding the
  538  * un_ed25519_id field of the link_specifier_t in 'inp'.
  539  */
  540 size_t link_specifier_getlen_un_ed25519_id(const link_specifier_t *inp);
  541 /** Return the element at position 'idx' of the fixed array field
  542  * un_ed25519_id of the link_specifier_t in 'inp'.
  543  */
  544 uint8_t link_specifier_get_un_ed25519_id(link_specifier_t *inp, size_t idx);
  545 /** As link_specifier_get_un_ed25519_id, but take and return a const
  546  * pointer
  547  */
  548 uint8_t link_specifier_getconst_un_ed25519_id(const link_specifier_t *inp, size_t idx);
  549 /** Change the element at position 'idx' of the fixed array field
  550  * un_ed25519_id of the link_specifier_t in 'inp', so that it will
  551  * hold the value 'elt'.
  552  */
  553 int link_specifier_set_un_ed25519_id(link_specifier_t *inp, size_t idx, uint8_t elt);
  554 /** Return a pointer to the 32-element array field un_ed25519_id of
  555  * 'inp'.
  556  */
  557 uint8_t * link_specifier_getarray_un_ed25519_id(link_specifier_t *inp);
  558 /** As link_specifier_get_un_ed25519_id, but take and return a const
  559  * pointer
  560  */
  561 const uint8_t  * link_specifier_getconstarray_un_ed25519_id(const link_specifier_t *inp);
  562 /** Return the length of the dynamic array holding the un_unrecognized
  563  * field of the link_specifier_t in 'inp'.
  564  */
  565 size_t link_specifier_getlen_un_unrecognized(const link_specifier_t *inp);
  566 /** Return the element at position 'idx' of the dynamic array field
  567  * un_unrecognized of the link_specifier_t in 'inp'.
  568  */
  569 uint8_t link_specifier_get_un_unrecognized(link_specifier_t *inp, size_t idx);
  570 /** As link_specifier_get_un_unrecognized, but take and return a const
  571  * pointer
  572  */
  573 uint8_t link_specifier_getconst_un_unrecognized(const link_specifier_t *inp, size_t idx);
  574 /** Change the element at position 'idx' of the dynamic array field
  575  * un_unrecognized of the link_specifier_t in 'inp', so that it will
  576  * hold the value 'elt'.
  577  */
  578 int link_specifier_set_un_unrecognized(link_specifier_t *inp, size_t idx, uint8_t elt);
  579 /** Append a new element 'elt' to the dynamic array field
  580  * un_unrecognized of the link_specifier_t in 'inp'.
  581  */
  582 int link_specifier_add_un_unrecognized(link_specifier_t *inp, uint8_t elt);
  583 /** Return a pointer to the variable-length array field
  584  * un_unrecognized of 'inp'.
  585  */
  586 uint8_t * link_specifier_getarray_un_unrecognized(link_specifier_t *inp);
  587 /** As link_specifier_get_un_unrecognized, but take and return a const
  588  * pointer
  589  */
  590 const uint8_t  * link_specifier_getconstarray_un_unrecognized(const link_specifier_t *inp);
  591 /** Change the length of the variable-length array field
  592  * un_unrecognized of 'inp' to 'newlen'.Fill extra elements with 0.
  593  * Return 0 on success; return -1 and set the error code on 'inp' on
  594  * failure.
  595  */
  596 int link_specifier_setlen_un_unrecognized(link_specifier_t *inp, size_t newlen);
  597 /** Return a newly allocated ed25519_cert with all elements set to
  598  * zero.
  599  */
  600 ed25519_cert_t *ed25519_cert_new(void);
  601 /** Release all storage held by the ed25519_cert in 'victim'. (Do
  602  * nothing if 'victim' is NULL.)
  603  */
  604 void ed25519_cert_free(ed25519_cert_t *victim);
  605 /** Try to parse a ed25519_cert from the buffer in 'input', using up
  606  * to 'len_in' bytes from the input buffer. On success, return the
  607  * number of bytes consumed and set *output to the newly allocated
  608  * ed25519_cert_t. On failure, return -2 if the input appears
  609  * truncated, and -1 if the input is otherwise invalid.
  610  */
  611 ssize_t ed25519_cert_parse(ed25519_cert_t **output, const uint8_t *input, const size_t len_in);
  612 /** Return the number of bytes we expect to need to encode the
  613  * ed25519_cert in 'obj'. On failure, return a negative value. Note
  614  * that this value may be an overestimate, and can even be an
  615  * underestimate for certain unencodeable objects.
  616  */
  617 ssize_t ed25519_cert_encoded_len(const ed25519_cert_t *obj);
  618 /** Try to encode the ed25519_cert from 'input' into the buffer at
  619  * 'output', using up to 'avail' bytes of the output buffer. On
  620  * success, return the number of bytes used. On failure, return -2 if
  621  * the buffer was not long enough, and -1 if the input was invalid.
  622  */
  623 ssize_t ed25519_cert_encode(uint8_t *output, size_t avail, const ed25519_cert_t *input);
  624 /** Check whether the internal state of the ed25519_cert in 'obj' is
  625  * consistent. Return NULL if it is, and a short message if it is not.
  626  */
  627 const char *ed25519_cert_check(const ed25519_cert_t *obj);
  628 /** Clear any errors that were set on the object 'obj' by its setter
  629  * functions. Return true iff errors were cleared.
  630  */
  631 int ed25519_cert_clear_errors(ed25519_cert_t *obj);
  632 /** Return the value of the version field of the ed25519_cert_t in
  633  * 'inp'
  634  */
  635 uint8_t ed25519_cert_get_version(const ed25519_cert_t *inp);
  636 /** Set the value of the version field of the ed25519_cert_t in 'inp'
  637  * to 'val'. Return 0 on success; return -1 and set the error code on
  638  * 'inp' on failure.
  639  */
  640 int ed25519_cert_set_version(ed25519_cert_t *inp, uint8_t val);
  641 /** Return the value of the cert_type field of the ed25519_cert_t in
  642  * 'inp'
  643  */
  644 uint8_t ed25519_cert_get_cert_type(const ed25519_cert_t *inp);
  645 /** Set the value of the cert_type field of the ed25519_cert_t in
  646  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  647  * code on 'inp' on failure.
  648  */
  649 int ed25519_cert_set_cert_type(ed25519_cert_t *inp, uint8_t val);
  650 /** Return the value of the exp_field field of the ed25519_cert_t in
  651  * 'inp'
  652  */
  653 uint32_t ed25519_cert_get_exp_field(const ed25519_cert_t *inp);
  654 /** Set the value of the exp_field field of the ed25519_cert_t in
  655  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  656  * code on 'inp' on failure.
  657  */
  658 int ed25519_cert_set_exp_field(ed25519_cert_t *inp, uint32_t val);
  659 /** Return the value of the cert_key_type field of the ed25519_cert_t
  660  * in 'inp'
  661  */
  662 uint8_t ed25519_cert_get_cert_key_type(const ed25519_cert_t *inp);
  663 /** Set the value of the cert_key_type field of the ed25519_cert_t in
  664  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  665  * code on 'inp' on failure.
  666  */
  667 int ed25519_cert_set_cert_key_type(ed25519_cert_t *inp, uint8_t val);
  668 /** Return the (constant) length of the array holding the
  669  * certified_key field of the ed25519_cert_t in 'inp'.
  670  */
  671 size_t ed25519_cert_getlen_certified_key(const ed25519_cert_t *inp);
  672 /** Return the element at position 'idx' of the fixed array field
  673  * certified_key of the ed25519_cert_t in 'inp'.
  674  */
  675 uint8_t ed25519_cert_get_certified_key(ed25519_cert_t *inp, size_t idx);
  676 /** As ed25519_cert_get_certified_key, but take and return a const
  677  * pointer
  678  */
  679 uint8_t ed25519_cert_getconst_certified_key(const ed25519_cert_t *inp, size_t idx);
  680 /** Change the element at position 'idx' of the fixed array field
  681  * certified_key of the ed25519_cert_t in 'inp', so that it will hold
  682  * the value 'elt'.
  683  */
  684 int ed25519_cert_set_certified_key(ed25519_cert_t *inp, size_t idx, uint8_t elt);
  685 /** Return a pointer to the 32-element array field certified_key of
  686  * 'inp'.
  687  */
  688 uint8_t * ed25519_cert_getarray_certified_key(ed25519_cert_t *inp);
  689 /** As ed25519_cert_get_certified_key, but take and return a const
  690  * pointer
  691  */
  692 const uint8_t  * ed25519_cert_getconstarray_certified_key(const ed25519_cert_t *inp);
  693 /** Return the value of the n_extensions field of the ed25519_cert_t
  694  * in 'inp'
  695  */
  696 uint8_t ed25519_cert_get_n_extensions(const ed25519_cert_t *inp);
  697 /** Set the value of the n_extensions field of the ed25519_cert_t in
  698  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  699  * code on 'inp' on failure.
  700  */
  701 int ed25519_cert_set_n_extensions(ed25519_cert_t *inp, uint8_t val);
  702 /** Return the length of the dynamic array holding the ext field of
  703  * the ed25519_cert_t in 'inp'.
  704  */
  705 size_t ed25519_cert_getlen_ext(const ed25519_cert_t *inp);
  706 /** Return the element at position 'idx' of the dynamic array field
  707  * ext of the ed25519_cert_t in 'inp'.
  708  */
  709 struct ed25519_cert_extension_st * ed25519_cert_get_ext(ed25519_cert_t *inp, size_t idx);
  710 /** As ed25519_cert_get_ext, but take and return a const pointer
  711  */
  712  const struct ed25519_cert_extension_st * ed25519_cert_getconst_ext(const ed25519_cert_t *inp, size_t idx);
  713 /** Change the element at position 'idx' of the dynamic array field
  714  * ext of the ed25519_cert_t in 'inp', so that it will hold the value
  715  * 'elt'. Free the previous value, if any.
  716  */
  717 int ed25519_cert_set_ext(ed25519_cert_t *inp, size_t idx, struct ed25519_cert_extension_st * elt);
  718 /** As ed25519_cert_set_ext, but does not free the previous value.
  719  */
  720 int ed25519_cert_set0_ext(ed25519_cert_t *inp, size_t idx, struct ed25519_cert_extension_st * elt);
  721 /** Append a new element 'elt' to the dynamic array field ext of the
  722  * ed25519_cert_t in 'inp'.
  723  */
  724 int ed25519_cert_add_ext(ed25519_cert_t *inp, struct ed25519_cert_extension_st * elt);
  725 /** Return a pointer to the variable-length array field ext of 'inp'.
  726  */
  727 struct ed25519_cert_extension_st * * ed25519_cert_getarray_ext(ed25519_cert_t *inp);
  728 /** As ed25519_cert_get_ext, but take and return a const pointer
  729  */
  730 const struct ed25519_cert_extension_st *  const  * ed25519_cert_getconstarray_ext(const ed25519_cert_t *inp);
  731 /** Change the length of the variable-length array field ext of 'inp'
  732  * to 'newlen'.Fill extra elements with NULL; free removed elements.
  733  * Return 0 on success; return -1 and set the error code on 'inp' on
  734  * failure.
  735  */
  736 int ed25519_cert_setlen_ext(ed25519_cert_t *inp, size_t newlen);
  737 /** Return the (constant) length of the array holding the signature
  738  * field of the ed25519_cert_t in 'inp'.
  739  */
  740 size_t ed25519_cert_getlen_signature(const ed25519_cert_t *inp);
  741 /** Return the element at position 'idx' of the fixed array field
  742  * signature of the ed25519_cert_t in 'inp'.
  743  */
  744 uint8_t ed25519_cert_get_signature(ed25519_cert_t *inp, size_t idx);
  745 /** As ed25519_cert_get_signature, but take and return a const pointer
  746  */
  747 uint8_t ed25519_cert_getconst_signature(const ed25519_cert_t *inp, size_t idx);
  748 /** Change the element at position 'idx' of the fixed array field
  749  * signature of the ed25519_cert_t in 'inp', so that it will hold the
  750  * value 'elt'.
  751  */
  752 int ed25519_cert_set_signature(ed25519_cert_t *inp, size_t idx, uint8_t elt);
  753 /** Return a pointer to the 64-element array field signature of 'inp'.
  754  */
  755 uint8_t * ed25519_cert_getarray_signature(ed25519_cert_t *inp);
  756 /** As ed25519_cert_get_signature, but take and return a const pointer
  757  */
  758 const uint8_t  * ed25519_cert_getconstarray_signature(const ed25519_cert_t *inp);
  759 /** Return a newly allocated extend2_cell_body with all elements set
  760  * to zero.
  761  */
  762 extend2_cell_body_t *extend2_cell_body_new(void);
  763 /** Release all storage held by the extend2_cell_body in 'victim'. (Do
  764  * nothing if 'victim' is NULL.)
  765  */
  766 void extend2_cell_body_free(extend2_cell_body_t *victim);
  767 /** Try to parse a extend2_cell_body from the buffer in 'input', using
  768  * up to 'len_in' bytes from the input buffer. On success, return the
  769  * number of bytes consumed and set *output to the newly allocated
  770  * extend2_cell_body_t. On failure, return -2 if the input appears
  771  * truncated, and -1 if the input is otherwise invalid.
  772  */
  773 ssize_t extend2_cell_body_parse(extend2_cell_body_t **output, const uint8_t *input, const size_t len_in);
  774 /** Return the number of bytes we expect to need to encode the
  775  * extend2_cell_body in 'obj'. On failure, return a negative value.
  776  * Note that this value may be an overestimate, and can even be an
  777  * underestimate for certain unencodeable objects.
  778  */
  779 ssize_t extend2_cell_body_encoded_len(const extend2_cell_body_t *obj);
  780 /** Try to encode the extend2_cell_body from 'input' into the buffer
  781  * at 'output', using up to 'avail' bytes of the output buffer. On
  782  * success, return the number of bytes used. On failure, return -2 if
  783  * the buffer was not long enough, and -1 if the input was invalid.
  784  */
  785 ssize_t extend2_cell_body_encode(uint8_t *output, size_t avail, const extend2_cell_body_t *input);
  786 /** Check whether the internal state of the extend2_cell_body in 'obj'
  787  * is consistent. Return NULL if it is, and a short message if it is
  788  * not.
  789  */
  790 const char *extend2_cell_body_check(const extend2_cell_body_t *obj);
  791 /** Clear any errors that were set on the object 'obj' by its setter
  792  * functions. Return true iff errors were cleared.
  793  */
  794 int extend2_cell_body_clear_errors(extend2_cell_body_t *obj);
  795 /** Return the value of the n_spec field of the extend2_cell_body_t in
  796  * 'inp'
  797  */
  798 uint8_t extend2_cell_body_get_n_spec(const extend2_cell_body_t *inp);
  799 /** Set the value of the n_spec field of the extend2_cell_body_t in
  800  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  801  * code on 'inp' on failure.
  802  */
  803 int extend2_cell_body_set_n_spec(extend2_cell_body_t *inp, uint8_t val);
  804 /** Return the length of the dynamic array holding the ls field of the
  805  * extend2_cell_body_t in 'inp'.
  806  */
  807 size_t extend2_cell_body_getlen_ls(const extend2_cell_body_t *inp);
  808 /** Return the element at position 'idx' of the dynamic array field ls
  809  * of the extend2_cell_body_t in 'inp'.
  810  */
  811 struct link_specifier_st * extend2_cell_body_get_ls(extend2_cell_body_t *inp, size_t idx);
  812 /** As extend2_cell_body_get_ls, but take and return a const pointer
  813  */
  814  const struct link_specifier_st * extend2_cell_body_getconst_ls(const extend2_cell_body_t *inp, size_t idx);
  815 /** Change the element at position 'idx' of the dynamic array field ls
  816  * of the extend2_cell_body_t in 'inp', so that it will hold the value
  817  * 'elt'. Free the previous value, if any.
  818  */
  819 int extend2_cell_body_set_ls(extend2_cell_body_t *inp, size_t idx, struct link_specifier_st * elt);
  820 /** As extend2_cell_body_set_ls, but does not free the previous value.
  821  */
  822 int extend2_cell_body_set0_ls(extend2_cell_body_t *inp, size_t idx, struct link_specifier_st * elt);
  823 /** Append a new element 'elt' to the dynamic array field ls of the
  824  * extend2_cell_body_t in 'inp'.
  825  */
  826 int extend2_cell_body_add_ls(extend2_cell_body_t *inp, struct link_specifier_st * elt);
  827 /** Return a pointer to the variable-length array field ls of 'inp'.
  828  */
  829 struct link_specifier_st * * extend2_cell_body_getarray_ls(extend2_cell_body_t *inp);
  830 /** As extend2_cell_body_get_ls, but take and return a const pointer
  831  */
  832 const struct link_specifier_st *  const  * extend2_cell_body_getconstarray_ls(const extend2_cell_body_t *inp);
  833 /** Change the length of the variable-length array field ls of 'inp'
  834  * to 'newlen'.Fill extra elements with NULL; free removed elements.
  835  * Return 0 on success; return -1 and set the error code on 'inp' on
  836  * failure.
  837  */
  838 int extend2_cell_body_setlen_ls(extend2_cell_body_t *inp, size_t newlen);
  839 /** Return the value of the create2 field of the extend2_cell_body_t
  840  * in 'inp'
  841  */
  842 struct create2_cell_body_st * extend2_cell_body_get_create2(extend2_cell_body_t *inp);
  843 /** As extend2_cell_body_get_create2, but take and return a const
  844  * pointer
  845  */
  846 const struct create2_cell_body_st * extend2_cell_body_getconst_create2(const extend2_cell_body_t *inp);
  847 /** Set the value of the create2 field of the extend2_cell_body_t in
  848  * 'inp' to 'val'. Free the old value if any. Steals the referenceto
  849  * 'val'.Return 0 on success; return -1 and set the error code on
  850  * 'inp' on failure.
  851  */
  852 int extend2_cell_body_set_create2(extend2_cell_body_t *inp, struct create2_cell_body_st *val);
  853 /** As extend2_cell_body_set_create2, but does not free the previous
  854  * value.
  855  */
  856 int extend2_cell_body_set0_create2(extend2_cell_body_t *inp, struct create2_cell_body_st *val);
  857 /** Return a newly allocated link_specifier_list with all elements set
  858  * to zero.
  859  */
  860 link_specifier_list_t *link_specifier_list_new(void);
  861 /** Release all storage held by the link_specifier_list in 'victim'.
  862  * (Do nothing if 'victim' is NULL.)
  863  */
  864 void link_specifier_list_free(link_specifier_list_t *victim);
  865 /** Try to parse a link_specifier_list from the buffer in 'input',
  866  * using up to 'len_in' bytes from the input buffer. On success,
  867  * return the number of bytes consumed and set *output to the newly
  868  * allocated link_specifier_list_t. On failure, return -2 if the input
  869  * appears truncated, and -1 if the input is otherwise invalid.
  870  */
  871 ssize_t link_specifier_list_parse(link_specifier_list_t **output, const uint8_t *input, const size_t len_in);
  872 /** Return the number of bytes we expect to need to encode the
  873  * link_specifier_list in 'obj'. On failure, return a negative value.
  874  * Note that this value may be an overestimate, and can even be an
  875  * underestimate for certain unencodeable objects.
  876  */
  877 ssize_t link_specifier_list_encoded_len(const link_specifier_list_t *obj);
  878 /** Try to encode the link_specifier_list from 'input' into the buffer
  879  * at 'output', using up to 'avail' bytes of the output buffer. On
  880  * success, return the number of bytes used. On failure, return -2 if
  881  * the buffer was not long enough, and -1 if the input was invalid.
  882  */
  883 ssize_t link_specifier_list_encode(uint8_t *output, size_t avail, const link_specifier_list_t *input);
  884 /** Check whether the internal state of the link_specifier_list in
  885  * 'obj' is consistent. Return NULL if it is, and a short message if
  886  * it is not.
  887  */
  888 const char *link_specifier_list_check(const link_specifier_list_t *obj);
  889 /** Clear any errors that were set on the object 'obj' by its setter
  890  * functions. Return true iff errors were cleared.
  891  */
  892 int link_specifier_list_clear_errors(link_specifier_list_t *obj);
  893 /** Return the value of the n_spec field of the link_specifier_list_t
  894  * in 'inp'
  895  */
  896 uint8_t link_specifier_list_get_n_spec(const link_specifier_list_t *inp);
  897 /** Set the value of the n_spec field of the link_specifier_list_t in
  898  * 'inp' to 'val'. Return 0 on success; return -1 and set the error
  899  * code on 'inp' on failure.
  900  */
  901 int link_specifier_list_set_n_spec(link_specifier_list_t *inp, uint8_t val);
  902 /** Return the length of the dynamic array holding the spec field of
  903  * the link_specifier_list_t in 'inp'.
  904  */
  905 size_t link_specifier_list_getlen_spec(const link_specifier_list_t *inp);
  906 /** Return the element at position 'idx' of the dynamic array field
  907  * spec of the link_specifier_list_t in 'inp'.
  908  */
  909 struct link_specifier_st * link_specifier_list_get_spec(link_specifier_list_t *inp, size_t idx);
  910 /** As link_specifier_list_get_spec, but take and return a const
  911  * pointer
  912  */
  913  const struct link_specifier_st * link_specifier_list_getconst_spec(const link_specifier_list_t *inp, size_t idx);
  914 /** Change the element at position 'idx' of the dynamic array field
  915  * spec of the link_specifier_list_t in 'inp', so that it will hold
  916  * the value 'elt'. Free the previous value, if any.
  917  */
  918 int link_specifier_list_set_spec(link_specifier_list_t *inp, size_t idx, struct link_specifier_st * elt);
  919 /** As link_specifier_list_set_spec, but does not free the previous
  920  * value.
  921  */
  922 int link_specifier_list_set0_spec(link_specifier_list_t *inp, size_t idx, struct link_specifier_st * elt);
  923 /** Append a new element 'elt' to the dynamic array field spec of the
  924  * link_specifier_list_t in 'inp'.
  925  */
  926 int link_specifier_list_add_spec(link_specifier_list_t *inp, struct link_specifier_st * elt);
  927 /** Return a pointer to the variable-length array field spec of 'inp'.
  928  */
  929 struct link_specifier_st * * link_specifier_list_getarray_spec(link_specifier_list_t *inp);
  930 /** As link_specifier_list_get_spec, but take and return a const
  931  * pointer
  932  */
  933 const struct link_specifier_st *  const  * link_specifier_list_getconstarray_spec(const link_specifier_list_t *inp);
  934 /** Change the length of the variable-length array field spec of 'inp'
  935  * to 'newlen'.Fill extra elements with NULL; free removed elements.
  936  * Return 0 on success; return -1 and set the error code on 'inp' on
  937  * failure.
  938  */
  939 int link_specifier_list_setlen_spec(link_specifier_list_t *inp, size_t newlen);
  940 
  941 
  942 #endif