X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=util.h;h=598e2b65c4d55a18d2ea3057bddd9732276fe08b;hb=03d4c598998e9373fd538ce1fb920c62dbde1cdd;hp=3549eb0fa251853c28f5c3aac1cdcd184c9ce180;hpb=46d06c3918b0080af7e87db986612e23bde4a341;p=secnet.git diff --git a/util.h b/util.h index 3549eb0..598e2b6 100644 --- a/util.h +++ b/util.h @@ -1,3 +1,22 @@ +/* + * This file is part of secnet. + * See README for full list of copyright holders. + * + * secnet is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * secnet is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * version 3 along with secnet; if not, see + * https://www.gnu.org/licenses/gpl.html. + */ + #ifndef util_h #define util_h @@ -67,12 +86,35 @@ extern void buffer_readonly_clone(struct buffer_if *n, const struct buffer_if*); * it must NOT be freed. */ extern void buf_append_string(struct buffer_if *buf, cstring_t s); + /* Append a two-byte length and the string to the buffer. Length is in + * network byte order. */ + +static inline int hex_encode_size(int binsize) { return binsize*2 + 1; } +extern void hex_encode(const uint8_t *bin, int binsize, char *buf); + /* Convert a byte array to hex into a supplied buffer. */ +extern string_t hex_encode_alloc(const uint8_t *bin, int binsize); + /* Returns the result in a freshly allocated string. */ + +extern bool_t hex_decode(uint8_t *buffer, int32_t buflen, int32_t *outlen, + cstring_t hb, bool_t allow_odd_nibble); + /* Convert a hex string to binary, storing the result in buffer. If + * allow_odd_nibble then it is acceptable if the input is an odd number of + * digits, and an additional leading zero digit is assumed; otherwise, this + * is not acceptable and the conversion fails. + * + * The input is processed left to right until it is consumed, the buffer is + * full, or an error is encountered in the input. The length of output + * produced is stored in *outlen. Returns true if the entire input was + * processed without error; otherwise false. */ extern void read_mpbin(MP_INT *a, uint8_t *bin, int binsize); + /* Convert a buffer into its MP_INT representation */ extern char *write_mpstring(MP_INT *a); + /* Convert a MP_INT into a hex string */ extern int32_t write_mpbin(MP_INT *a, uint8_t *buffer, int32_t buflen); + /* Convert a MP_INT into a buffer; return length; truncate if necessary */ extern struct log_if *init_log(list_t *loglist); @@ -82,6 +124,9 @@ extern void send_nak(const struct comm_addr *dest, uint32_t our_index, extern int consttime_memeq(const void *s1, const void *s2, size_t n); +void hash_hash(const struct hash_if *hashi, const void *msg, int32_t len, + uint8_t *digest /* hi->hlen bytes */); + const char *iaddr_to_string(const union iaddr *ia); int iaddr_socklen(const union iaddr *ia); @@ -89,6 +134,21 @@ void string_item_to_iaddr(const item_t *item, uint16_t port, union iaddr *ia, const char *desc); +/* + * SBUF_DEFINE(int nbufs, size_t size); + * // Generates a number of definitions and statements organising + * // nbufs rotating char[size] buffers such that subsequent code + * // may refer to: + * char *const SBUF; + */ +#define SBUF_DEFINE(nbufs, size) \ + static int static_bufs__bufnum; \ + static char static_bufs__bufs[(nbufs)][(size)]; \ + static_bufs__bufnum++; \ + static_bufs__bufnum %= (nbufs); \ + static_bufs__bufs[static_bufs__bufnum] +#define SBUF (static_bufs__bufs[static_bufs__bufnum]) + /*----- line-buffered asynch input -----*/ enum async_linebuf_result { @@ -98,6 +158,8 @@ enum async_linebuf_result { async_linebuf_broken, }; +const char *pollbadbit(int revents); /* returns 0, or bad bit description */ + enum async_linebuf_result async_linebuf_read(struct pollfd *pfd, struct buffer_if *buf, const char **emsg_out);