libpktlab - The PacketLab Utility Library
pktctrl.h
Go to the documentation of this file.
1// pktctrl.h
2// The pktctrl module for handling the pktlab control session.
3//
4
13#ifndef _PKTCTRL_H_
14#define _PKTCTRL_H_
15
16#include <pktlab.h>
17
18#include <stdbool.h>
19#include <stddef.h>
20#include <stdint.h>
21
22#include <poll.h>
23#include <sys/select.h>
24
25//
26// EXPORTED CONSTANTS
27//
28
39#define PKTCTRL_SNIKEY_LEN_MIN 1
40#define PKTCTRL_SNIKEY_LEN_MAX 63 // i.e. the maximum domain name label length
41
47 PKTCTRL_SUCCESS = 0,
48 PKTCTRL_INVAL = 1,
49 PKTCTRL_MAP_ERR = 2,
50 PKTCTRL_KEY_NOT_FOUND = 3,
51 PKTCTRL_SSL_FAILURE = 4,
52 PKTCTRL_BAD_CERT = 5,
53 PKTCTRL_BAD_CERTKEY = 6,
54 PKTCTRL_IN_PROGRESS = 7,
55 PKTCTRL_UNKNOWN_FAULT = 127,
56};
57
58//
59// EXPORTED FUNCTION DECLARATIONS
60//
61
66struct pktctrl_obj; // opaque
71struct pktctrl_keycert_store; // opaque
72
79extern struct pktctrl_obj * pktctrl_create_obj(void);
88
113 struct pktctrl_keycert_store * store, const char * snikey,
114 struct pktlab_certificate ** cert_ls, uint_fast32_t certnum,
115 struct pktlab_publickey ** root_ls, uint_fast32_t rootnum);
134 struct pktctrl_keycert_store * store, const char * snikey,
135 struct pktlab_certificate *** cert_ls, uint_fast32_t * certnum,
136 struct pktlab_publickey *** root_ls, uint_fast32_t * rootnum);
153 struct pktctrl_keycert_store * store, const char * snikey);
154
171 struct pktctrl_keycert_store * store, const char * snikey);
183 struct pktctrl_keycert_store * store);
184
207 struct pktctrl_keycert_store * store,
208 struct pktlab_certificate ** cert_ls, uint_fast32_t certnum,
209 struct pktlab_publickey ** root_ls, uint_fast32_t rootnum);
226 struct pktctrl_keycert_store * store,
227 struct pktlab_certificate *** cert_ls, uint_fast32_t * certnum,
228 struct pktlab_publickey *** root_ls, uint_fast32_t * rootnum);
242
243// normal pktctrl session setup functions
244// uses TLS while incorporating pktlab access control checks
268extern int pktctrl_accept (
269 int fd, int auth_mode,
270 struct pktlab_privatekey * serverkey,
271 struct pktctrl_keycert_store * store, struct pktctrl_obj * ctrlobj,
272 struct pktlab_certificate *** peer_cert_ls, uint_fast32_t * peer_cert_num);
299extern int pktctrl_connect (
300 int fd, int auth_mode, const char * snikey,
301 struct pktlab_privatekey * clientkey,
302 struct pktctrl_keycert_store * store, struct pktctrl_obj * ctrlobj,
303 struct pktlab_certificate *** peer_cert_ls, uint_fast32_t * peer_cert_num);
304
305// special no setup alternative
306// uses bare-bone TCP connection with no access control checks conducted
322 int fd, struct pktctrl_obj * ctrlobj);
323
342 int * nfds, fd_set * restrict rset, fd_set * restrict wset,
343 bool want_read, bool want_write, struct pktctrl_obj * ctrlobj);
360 const fd_set * restrict rset, const fd_set * restrict wset,
361 struct pktctrl_obj * ctrlobj, bool * readable, bool * writable);
362
363extern int pktctrl_prepare_poll (
364 struct pollfd * restrict pfd,
365 bool want_read, bool want_write,
366 struct pktctrl_obj * ctrlobj);
367extern int pktctrl_process_poll (
368 const struct pollfd * restrict pfd,
369 struct pktctrl_obj * ctrlobj,
370 bool * readable, bool * writable);
371
381 struct pktctrl_obj * ctrlobj,
382 struct pktlab_message ** msgptr);
392 struct pktctrl_obj * ctrlobj,
393 const struct pktlab_message * msg);
401extern int pktctrl_flush_write(struct pktctrl_obj * ctrlobj);
409extern size_t pktctrl_write_unsent(const struct pktctrl_obj * ctrlobj);
410
411// for non-buffered raw bytes reading
412// should not be used after using pktctrl_read_message/pktctrl_write_message
423extern ssize_t pktctrl_read (
424 struct pktctrl_obj * obj,
425 void * buf, size_t nbyte);
436extern ssize_t pktctrl_write (
437 struct pktctrl_obj * obj,
438 const void * buf, size_t nbyte);
439
451extern int pktctrl_close(struct pktctrl_obj * obj);
463
469extern bool pktctrl_is_established(struct pktctrl_obj * obj);
470
478extern bool pktctrl_is_valid_snikey(const char * snikey);
489extern int pktctrl_gen_snikey(char ** buf);
490
491#endif
General utilities for pktlab.
size_t pktctrl_write_unsent(const struct pktctrl_obj *ctrlobj)
Get established pktctrl session internal writer buffered content length.
int pktctrl_clear_server_keycert(struct pktctrl_keycert_store *store, const char *snikey)
Delete server certificate chain and trusted roots entry for some snikey from server pktctrl key certi...
int pktctrl_raw_session(int fd, struct pktctrl_obj *ctrlobj)
Set up pktctrl session object struct to establish barebone TCP pktctrl session.
int pktctrl_set_client_keycert(struct pktctrl_keycert_store *store, struct pktlab_certificate **cert_ls, uint_fast32_t certnum, struct pktlab_publickey **root_ls, uint_fast32_t rootnum)
Load client certificate chain and trusted roots into pktctrl key certificate storage struct.
int pktctrl_clear_client_keycert(struct pktctrl_keycert_store *store)
Delete client certificate chain and trusted roots from client pktctrl key certificate storage struct.
struct pktctrl_keycert_store * pktctrl_create_keycert_store(void)
Get initialized pktctrl key certificate storage struct.
bool pktctrl_is_valid_snikey(const char *snikey)
Check if '\0'-terminated string is a valid snikey.
int pktctrl_flush_write(struct pktctrl_obj *ctrlobj)
Flush established pktctrl session internal writer buffer.
int pktctrl_prepare_select(int *nfds, fd_set *restrict rset, fd_set *restrict wset, bool want_read, bool want_write, struct pktctrl_obj *ctrlobj)
Set up arguments to select() for read/write operation on established pktctrl session based on intenti...
int pktctrl_gen_snikey(char **buf)
Generate random '\0'-terminated valid snikey of PKTCTRL_SNIKEY_LEN_MAX length.
int pktctrl_write_message(struct pktctrl_obj *ctrlobj, const struct pktlab_message *msg)
Write pktctrl message to established pktctrl session.
int pktctrl_clear_server_keycert_default(struct pktctrl_keycert_store *store)
Clear server pktctrl key certificate storage default entry.
struct pktctrl_obj * pktctrl_create_obj(void)
Get initialized pktctrl session object struct.
pktctrl_err
pktctrl module defined error values.
Definition: pktctrl.h:46
ssize_t pktctrl_write(struct pktctrl_obj *obj, const void *buf, size_t nbyte)
Write bytes to established pktctrl session.
int pktctrl_get_client_keycert(struct pktctrl_keycert_store *store, struct pktlab_certificate ***cert_ls, uint_fast32_t *certnum, struct pktlab_publickey ***root_ls, uint_fast32_t *rootnum)
Get loaded client certificate chain and trusted roots from client pktctrl key certificate storage str...
int pktctrl_cleanup_keycert_store(struct pktctrl_keycert_store *store)
Free an allocated pktctrl key certificate storage struct.
int pktctrl_set_server_keycert_default(struct pktctrl_keycert_store *store, const char *snikey)
Set server pktctrl key certificate storage default entry.
int pktctrl_accept(int fd, int auth_mode, struct pktlab_privatekey *serverkey, struct pktctrl_keycert_store *store, struct pktctrl_obj *ctrlobj, struct pktlab_certificate ***peer_cert_ls, uint_fast32_t *peer_cert_num)
Perform TLS server-side handshake to establish TLS pktctrl session.
int pktctrl_close(struct pktctrl_obj *obj)
Close and free an allocated pktctrl session object struct.
int pktctrl_read_message(struct pktctrl_obj *ctrlobj, struct pktlab_message **msgptr)
Read pktctrl message from established pktctrl session.
bool pktctrl_is_established(struct pktctrl_obj *obj)
Check if a pktctrl session object is established.
int pktctrl_set_server_keycert(struct pktctrl_keycert_store *store, const char *snikey, struct pktlab_certificate **cert_ls, uint_fast32_t certnum, struct pktlab_publickey **root_ls, uint_fast32_t rootnum)
Load server certificate chain and trusted roots for some snikey into pktctrl key certificate storage ...
int pktctrl_process_select(const fd_set *restrict rset, const fd_set *restrict wset, struct pktctrl_obj *ctrlobj, bool *readable, bool *writable)
Process select() results to identify if read/write operation on established pktctrl session can be pe...
int pktctrl_connect(int fd, int auth_mode, const char *snikey, struct pktlab_privatekey *clientkey, struct pktctrl_keycert_store *store, struct pktctrl_obj *ctrlobj, struct pktlab_certificate ***peer_cert_ls, uint_fast32_t *peer_cert_num)
Perform TLS client-side handshake to establish TLS pktctrl session.
ssize_t pktctrl_read(struct pktctrl_obj *obj, void *buf, size_t nbyte)
Read bytes from established pktctrl session.
int pktctrl_get_server_keycert(struct pktctrl_keycert_store *store, const char *snikey, struct pktlab_certificate ***cert_ls, uint_fast32_t *certnum, struct pktlab_publickey ***root_ls, uint_fast32_t *rootnum)
Get loaded server certificate chain and trusted roots for some snikey from server pktctrl key certifi...
Structure for storing the decoded form of pktlab messages.
Definition: pktlab.h:790
pktlab public key opaque struct.
pktlab private key opaque struct.
pktlab certificate opaque struct.
pktctrl session object opaque struct.
pktctrl key certificate storage opaque struct.