server/bulkcrypto.c: Implement a bulk transform based on AEAD schemes.
[tripe] / server / tripe.h
index 0595682..ea980c6 100644 (file)
 #include <catacomb/ct.h>
 
 #include <catacomb/chacha.h>
+#include <catacomb/gaead.h>
 #include <catacomb/gcipher.h>
 #include <catacomb/gmac.h>
 #include <catacomb/grand.h>
+#include <catacomb/latinpoly.h>
 #include <catacomb/key.h>
 #include <catacomb/paranoia.h>
 #include <catacomb/poly1305.h>
@@ -598,7 +600,7 @@ typedef struct tunnel_ops {
   const char *name;                    /* Name of this tunnel driver */
   unsigned flags;                      /* Various interesting flags */
 #define TUNF_PRIVOPEN 1u               /*   Need helper to open file */
-  void (*init)(void);                  /* Initializes the system */
+  int (*init)(void);                   /* Initializes the system */
   tunnel *(*create)(struct peer */*p*/, int /*fd*/, char **/*ifn*/);
                                        /* Initializes a new tunnel */
   void (*setifname)(tunnel */*t*/, const char */*ifn*/);
@@ -611,6 +613,10 @@ typedef struct tunnel_ops {
 struct tunnel { const tunnel_ops *ops; };
 #endif
 
+typedef struct tun_iter {
+  const struct tunnel_node *next;
+} tun_iter;
+
 /* --- Peer statistics --- *
  *
  * Contains various interesting and not-so-interesting statistics about a
@@ -815,11 +821,9 @@ struct admin {
 
 extern sel_state sel;                  /* Global I/O event state */
 extern octet buf_i[PKBUFSZ], buf_o[PKBUFSZ], buf_t[PKBUFSZ], buf_u[PKBUFSZ];
-extern const tunnel_ops *tunnels[];    /* Table of tunnels (0-term) */
-extern const tunnel_ops *tun_default;  /* Default tunnel to use */
 extern udpsocket udpsock[NADDRFAM];    /* The master UDP sockets */
 extern kdata *master;                  /* Default private key */
-extern const char *tag_priv;           /* Default private key tag */
+extern char *tag_priv;                 /* Default private key tag */
 
 #ifndef NTRACE
 extern const trace_opt tr_opts[];      /* Trace options array */
@@ -839,14 +843,14 @@ extern unsigned tr_flags;         /* Trace options flags */
  *             @const char *pubkr@ = public keyring file
  *             @const char *ptag@ = default private-key tag
  *
- * Returns:    ---
+ * Returns:    Zero on success, @-1@ on failure.
  *
  * Use:                Initializes the key-management machinery, loading the
  *             keyrings and so on.
  */
 
-extern void km_init(const char */*privkr*/, const char */*pubkr*/,
-                   const char */*ptag*/);
+extern int km_init(const char */*privkr*/, const char */*pubkr*/,
+                  const char */*ptag*/);
 
 /* --- @km_reload@ --- *
  *
@@ -859,6 +863,20 @@ extern void km_init(const char */*privkr*/, const char */*pubkr*/,
 
 extern int km_reload(void);
 
+/* --- @km_clear@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Forget the currently loaded keyrings.  The @master@ key will
+ *             be cleared, but other keys already loaded will continue to
+ *             exist until their reference count drops to zero.  Call
+ *             @km_init@ to make everything work again.
+ */
+
+extern void km_clear(void);
+
 /* --- @km_findpub@, @km_findpriv@ --- *
  *
  * Arguments:  @const char *tag@ = key tag to load
@@ -1233,7 +1251,9 @@ extern int c_check(const void */*m*/, size_t /*msz*/, buf */*b*/);
  *
  *               * "?PEER" PEER -- peer's name
  *
- *               * "?ERRNO" ERRNO -- system error code
+ *               * "?ERR" CODE -- system error code
+ *
+ *               * "?ERRNO" -- system error code from @errno@
  *
  *               * "[!]..." ... -- @dstr_putf@-like string as single token
  */
@@ -1305,17 +1325,6 @@ extern void EXECL_LIKE(0) a_notify(const char */*fmt*/, ...);
 
 extern void a_create(int /*fd_in*/, int /*fd_out*/, unsigned /*f*/);
 
-/* --- @a_quit@ --- *
- *
- * Arguments:  ---
- *
- * Returns:    ---
- *
- * Use:                Shuts things down nicely.
- */
-
-extern void a_quit(void);
-
 /* --- @a_preselect@ --- *
  *
  * Arguments:  ---
@@ -1347,13 +1356,24 @@ extern void a_daemon(void);
  *             @gid_t g@ = group to own the socket
  *             @mode_t m@ = permissions to set on the socket
  *
- * Returns:    ---
+ * Returns:    Zero on success, @-1@ on failure.
  *
  * Use:                Creates the admin listening socket.
  */
 
-extern void a_listen(const char */*sock*/,
-                    uid_t /*u*/, gid_t /*g*/, mode_t /*m*/);
+extern int a_listen(const char */*sock*/,
+                   uid_t /*u*/, gid_t /*g*/, mode_t /*m*/);
+
+/* --- @a_unlisten@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Stops listening to the administration socket and removes it.
+ */
+
+extern void a_unlisten(void);
 
 /* --- @a_switcherr@ --- *
  *
@@ -1391,12 +1411,12 @@ extern void a_signals(void);
  *             @gid_t g@ = group to own the socket
  *             @mode_t m@ = permissions to set on the socket
  *
- * Returns:    ---
+ * Returns:    Zero on success, @-1@ on failure.
  *
  * Use:                Creates the admin listening socket.
  */
 
-extern void a_init(void);
+extern int a_init(void);
 
 /*----- Mapping with addresses as keys ------------------------------------*/
 
@@ -1496,13 +1516,13 @@ extern int ps_tunfd(const tunnel_ops */*tops*/, char **/*ifn*/);
  *
  * Arguments:  @int detachp@ = whether to detach the child from its terminal
  *
- * Returns:    ---
+ * Returns:    Zero on success, @-1@ on failure.
  *
  * Use:                Separates off the privileged tunnel-opening service from the
  *             rest of the server.
  */
 
-extern void ps_split(int /*detachp*/);
+extern int ps_split(int /*detachp*/);
 
 /* --- @ps_quit@ --- *
  *
@@ -1689,12 +1709,24 @@ extern const addr *p_addr(peer */*p*/);
  *
  * Arguments:  @struct addrinfo *ailist@ = addresses to bind to
  *
- * Returns:    ---
+ * Returns:    Zero on success, @-1@ on failure.
  *
  * Use:                Binds to the main UDP sockets.
  */
 
-extern void p_bind(struct addrinfo */*ailist*/);
+extern int p_bind(struct addrinfo */*ailist*/);
+
+/* --- @p_unbind@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Unbinds the UDP sockets.  There must not be any active peers,
+ *             and none can be created until the sockets are rebound.
+ */
+
+extern void p_unbind(void);
 
 /* --- @p_init@ --- *
  *
@@ -1707,6 +1739,90 @@ extern void p_bind(struct addrinfo */*ailist*/);
 
 extern void p_init(void);
 
+/* --- @p_addtun@ --- *
+ *
+ * Arguments:  @const tunnel_ops *tops@ = tunnel ops to add
+ *
+ * Returns:    Zero on success, @-1@ on failure.
+ *
+ * Use:                Adds a tunnel class to the list of known classes, if it
+ *             initializes properly.  If there is no current default tunnel,
+ *             then this one is made the default.
+ *
+ *             Does nothing if the tunnel class is already known.  So adding
+ *             a bunch of tunnels takes quadratic time, but there will be
+ *             too few to care about.
+ */
+
+extern int p_addtun(const tunnel_ops */*tops*/);
+
+/* --- @p_setdflttun@ --- *
+ *
+ * Arguments:  @const tunnel_ops *tops@ = tunnel ops to set
+ *
+ * Returns:    ---
+ *
+ * Use:                Sets the default tunnel.  It must already be registered.  The
+ *             old default is forgotten.
+ */
+
+extern void p_setdflttun(const tunnel_ops */*tops*/);
+
+/* --- @p_dflttun@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    A pointer to the current default tunnel operations, or null
+ *             if no tunnels are defined.
+ */
+
+extern const tunnel_ops *p_dflttun(void);
+
+/* --- @p_findtun@ --- *
+ *
+ * Arguments:  @const char *name@ = tunnel name
+ *
+ * Returns:    Pointer to the tunnel operations, or null.
+ *
+ * Use:                Finds the operations for a named tunnel class.
+ */
+
+extern const tunnel_ops *p_findtun(const char */*name*/);
+
+/* --- @p_mktuniter@ --- *
+ *
+ * Arguments:  @tuniter *i@ = pointer to iterator to initialize
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes a tunnel iterator.
+ */
+
+extern void p_mktuniter(tun_iter */*i*/);
+
+/* --- @p_nexttun@ --- *
+ *
+ * Arguments:  @tuniter *i@ = pointer to iterator
+ *
+ * Returns:    Pointer to the next tunnel's operations, or null.
+ */
+
+extern const tunnel_ops *p_nexttun(tun_iter */*i*/);
+
+/* --- @FOREACH_TUN@ --- *
+ *
+ * Arguments:  @tops@ = name to bind to each tunnel
+ *             @stuff@ = thing to do for each item
+ *
+ * Use:                Does something for each known tunnel class.
+ */
+
+#define FOREACH_TUN(tops, stuff) do {                                  \
+  tun_iter i_;                                                         \
+  const tunnel_ops *tops;                                              \
+  for (p_mktuniter(&i_); (tops = p_nexttun(&i_)) != 0; ) stuff;                \
+} while (0)
+
 /* --- @p_create@ --- *
  *
  * Arguments:  @peerspec *spec@ = information about this peer
@@ -1791,6 +1907,17 @@ extern peer *p_find(const char */*name*/);
 
 extern void p_destroy(peer */*p*/, int /*bye*/);
 
+/* --- @p_destroyall@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Destroys all of the peers, saying goodbye.
+ */
+
+extern void p_destroyall(void);
+
 /* --- @FOREACH_PEER@ --- *
  *
  * Arguments:  @p@ = name to bind to each peer
@@ -1827,6 +1954,68 @@ extern void p_mkiter(peer_iter */*i*/);
 
 extern peer *p_next(peer_iter */*i*/);
 
+/*----- The interval timer ------------------------------------------------*/
+
+/* --- @iv_addreason@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Adds an `interval timer reason'; if there are no others, the
+ *             interval timer is engaged.
+ */
+
+extern void iv_addreason(void);
+
+/* --- @iv_rmreason@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Removes an interval timer reason; if there are none left, the
+ *             interval timer is disengaged.
+ */
+
+extern void iv_rmreason(void);
+
+/*----- The main loop -----------------------------------------------------*/
+
+/* --- @lp_init@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes the main loop.  Most importantly, this sets up
+ *             the select multiplexor that everything else hooks onto.
+ */
+
+extern void lp_init(void);
+
+/* --- @lp_end@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Requests an exit from the main loop.
+ */
+
+extern void lp_end(void);
+
+/* --- @lp_run@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    Zero on successful termination; @-1@ if things went wrong.
+ *
+ * Use:                Cranks the main loop until it should be cranked no more.
+ */
+
+extern int lp_run(void);
+
 /*----- Tunnel drivers ----------------------------------------------------*/
 
 #ifdef TUN_LINUX