X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=secnet.h;h=9bec310c1b8f280a54a0dec91377faad930780f4;hp=6559ef325874406a84267bda3ee9bdcdd4f49ad1;hb=686b7f1da023663c0df9bdcf351b4313b5726888;hpb=45cfab8ca7db61ce4677e2e77e76b9266c57ab12 diff --git a/secnet.h b/secnet.h index 6559ef3..9bec310 100644 --- a/secnet.h +++ b/secnet.h @@ -7,26 +7,13 @@ #include #include #include +#include +#include #include #include #include #include -/* - * Macros added by SGT for endianness-independence - */ -#define GET_32BIT_MSB_FIRST(cp) \ - (((unsigned long)(unsigned char)(cp)[0] << 24) | \ - ((unsigned long)(unsigned char)(cp)[1] << 16) | \ - ((unsigned long)(unsigned char)(cp)[2] << 8) | \ - ((unsigned long)(unsigned char)(cp)[3])) - -#define PUT_32BIT_MSB_FIRST(cp, value) ( \ - (cp)[0] = (char)((value) >> 24), \ - (cp)[1] = (char)((value) >> 16), \ - (cp)[2] = (char)((value) >> 8), \ - (cp)[3] = (char)(value) ) - typedef char *string_t; typedef const char *cstring_t; typedef enum {False,True} bool_t; @@ -159,6 +146,16 @@ static const struct timeval *const tv_now = &tv_now_global; /***** END of utility functions *****/ +/***** START of max_start_pad handling *****/ + +extern int32_t site_max_start_pad, transform_max_start_pad, + comm_max_start_pad; + +void update_max_start_pad(int32_t *our_module_global, int32_t our_instance); +int32_t calculate_max_start_pad(void); + +/***** END of max_start_pad handling *****/ + /***** SCHEDULING support */ /* If nfds_io is insufficient for your needs, set it to the required @@ -184,17 +181,24 @@ extern void register_for_poll(void *st, beforepoll_fn *before, /* The secnet program goes through a number of phases in its lifetime. Module code may arrange to be called just as various phases are - entered. */ - -#define PHASE_INIT 0 -#define PHASE_GETOPTS 1 /* Process command-line arguments */ -#define PHASE_READCONFIG 2 /* Parse and process configuration file */ -#define PHASE_SETUP 3 /* Process information in configuration */ -#define PHASE_GETRESOURCES 4 /* Obtain all external resources */ -#define PHASE_DROPPRIV 5 /* Last chance for privileged operations */ -#define PHASE_RUN 6 -#define PHASE_SHUTDOWN 7 /* About to die; delete key material, etc. */ -#define NR_PHASES 8 + entered. + + Remember to update the table in util.c if changing the set of + phases. */ + +enum phase { + PHASE_INIT, + PHASE_GETOPTS, /* Process command-line arguments */ + PHASE_READCONFIG, /* Parse and process configuration file */ + PHASE_SETUP, /* Process information in configuration */ + PHASE_DAEMONIZE, /* Become a daemon (if necessary) */ + PHASE_GETRESOURCES, /* Obtain all external resources */ + PHASE_DROPPRIV, /* Last chance for privileged operations */ + PHASE_RUN, + PHASE_SHUTDOWN, /* About to die; delete key material, etc. */ + /* Keep this last: */ + NR_PHASES, +}; typedef void hook_fn(void *self, uint32_t newphase); bool_t add_hook(uint32_t phase, hook_fn *f, void *state); @@ -225,7 +229,8 @@ extern init_module random_module; extern init_module udp_module; extern init_module util_module; extern init_module site_module; -extern init_module transform_module; +extern init_module transform_eax_module; +extern init_module transform_cbcmac_module; extern init_module netlink_module; extern init_module rsa_module; extern init_module dh_module; @@ -303,23 +308,37 @@ struct rsaprivkey_if { /* COMM interface */ +struct comm_addr { + /* This struct is pure data; in particular comm's clients may + freely copy it. */ + /* Everyone is also guaranteed that all padding is set to zero, ie + that comm_addrs referring to semantically identical peers will + compare equal with memcmp. Anyone who constructs a comm_addr + must start by memsetting it with FILLZERO, or some + equivalent. */ + struct comm_if *comm; + struct sockaddr_in sin; +}; + /* Return True if the packet was processed, and shouldn't be passed to any other potential receivers. */ typedef bool_t comm_notify_fn(void *state, struct buffer_if *buf, - struct sockaddr_in *source); + const struct comm_addr *source); typedef void comm_request_notify_fn(void *commst, void *nst, comm_notify_fn *fn); typedef void comm_release_notify_fn(void *commst, void *nst, comm_notify_fn *fn); typedef bool_t comm_sendmsg_fn(void *commst, struct buffer_if *buf, - struct sockaddr_in *dest); + const struct comm_addr *dest); +typedef const char *comm_addr_to_string_fn(void *commst, + const struct comm_addr *ca); + /* Returned string is in a static buffer. */ struct comm_if { void *st; - int32_t min_start_pad; - int32_t min_end_pad; comm_request_notify_fn *request_notify; comm_release_notify_fn *release_notify; comm_sendmsg_fn *sendmsg; + comm_addr_to_string_fn *addr_to_string; }; /* LOG interface */ @@ -329,8 +348,8 @@ typedef void log_vmsg_fn(void *st, int class, const char *message, va_list args); struct log_if { void *st; - log_msg_fn *log; - log_vmsg_fn *vlog; + log_msg_fn *logfn; /* Do not call these directly - you don't get */ + log_vmsg_fn *vlogfn; /* printf format checking. Use [v]slilog instead */ }; /* (convenience functions, defined in util.c) */ extern void slilog(struct log_if *lf, int class, const char *message, ...) @@ -353,26 +372,34 @@ struct site_if { /* TRANSFORM interface */ /* A reversable transformation. Transforms buffer in-place; may add - data to start or end. Maximum amount of data to be added specified - in max_start_pad and max_end_pad. (Reverse transformations decrease + data to start or end. (Reverse transformations decrease length, of course.) Transformations may be key-dependent, in which case key material is passed in at initialisation time. They may also depend on internal factors (eg. time) and keep internal state. A struct transform_if only represents a particular type of transformation; instances of the transformation (eg. with - particular key material) have a different C type. */ + particular key material) have a different C type. The same + secret key will be used in opposite directions between a pair of + secnets; one of these pairs will get direction==False, the other True. */ typedef struct transform_inst_if *transform_createinstance_fn(void *st); -typedef bool_t transform_setkey_fn(void *st, uint8_t *key, int32_t keylen); +typedef bool_t transform_setkey_fn(void *st, uint8_t *key, int32_t keylen, + bool_t direction); +typedef bool_t transform_valid_fn(void *st); /* 0: no key; 1: ok */ typedef void transform_delkey_fn(void *st); typedef void transform_destroyinstance_fn(void *st); -/* Returns 0 for 'all is well', any other value for a problem */ +/* Returns: + * 0: all is well + * 1: for any other problem + * 2: message decrypted but sequence number was out of range + */ typedef uint32_t transform_apply_fn(void *st, struct buffer_if *buf, const char **errmsg); struct transform_inst_if { void *st; transform_setkey_fn *setkey; + transform_valid_fn *valid; transform_delkey_fn *delkey; transform_apply_fn *forwards; transform_apply_fn *reverse; @@ -381,9 +408,8 @@ struct transform_inst_if { struct transform_if { void *st; - int32_t max_start_pad; /* these three are all <<< INT_MAX */ - int32_t max_end_pad; - int32_t keylen; + int capab_transformnum; + int32_t keylen; /* <<< INT_MAX */ transform_createinstance_fn *create; }; @@ -397,15 +423,15 @@ struct transform_if { typedef void netlink_deliver_fn(void *st, struct buffer_if *buf); /* site code can tell netlink when outgoing packets will be dropped, so netlink can generate appropriate ICMP and make routing decisions */ -#define LINK_QUALITY_DOWN 0 /* No chance of a packet being delivered */ -#define LINK_QUALITY_DOWN_STALE_ADDRESS 1 /* Link down, old address information */ -#define LINK_QUALITY_DOWN_CURRENT_ADDRESS 2 /* Link down, current address information */ -#define LINK_QUALITY_UP 3 /* Link active */ +#define LINK_QUALITY_UNUSED 0 /* This link is unused, do not make this netlink */ +#define LINK_QUALITY_DOWN 1 /* No chance of a packet being delivered right away*/ +#define LINK_QUALITY_DOWN_STALE_ADDRESS 2 /* Link down, old address information */ +#define LINK_QUALITY_DOWN_CURRENT_ADDRESS 3 /* Link down, current address information */ +#define LINK_QUALITY_UP 4 /* Link active */ #define MAXIMUM_LINK_QUALITY 3 typedef void netlink_link_quality_fn(void *st, uint32_t quality); typedef void netlink_register_fn(void *st, netlink_deliver_fn *deliver, - void *dst, int32_t max_start_pad, - int32_t max_end_pad); + void *dst); typedef void netlink_output_config_fn(void *st, struct buffer_if *buf); typedef bool_t netlink_check_config_fn(void *st, struct buffer_if *buf); typedef void netlink_set_mtu_fn(void *st, int32_t new_mtu); @@ -414,8 +440,6 @@ struct netlink_if { netlink_register_fn *reg; netlink_deliver_fn *deliver; netlink_link_quality_fn *set_quality; - netlink_output_config_fn *output_config; - netlink_check_config_fn *check_config; netlink_set_mtu_fn *set_mtu; }; @@ -431,6 +455,7 @@ typedef void dh_makeshared_fn(void *st, uint8_t *secret, struct dh_if { void *st; int32_t len; /* Approximate size of modulus in bytes */ + int32_t ceil_len; /* Number of bytes just sufficient to contain modulus */ dh_makepublic_fn *makepublic; dh_makeshared_fn *makeshared; }; @@ -473,21 +498,25 @@ struct buffer_if { #define M_FATAL 0x100 /* The fatal() family of functions require messages that do not end in '\n' */ -extern NORETURN(fatal(const char *message, ...)); -extern NORETURN(fatal_perror(const char *message, ...)); -extern NORETURN(fatal_status(int status, const char *message, ...)); -extern NORETURN(fatal_perror_status(int status, const char *message, ...)); +extern NORETURN(fatal(const char *message, ...)) FORMAT(printf,1,2); +extern NORETURN(fatal_perror(const char *message, ...)) FORMAT(printf,1,2); +extern NORETURN(fatal_status(int status, const char *message, ...)) + FORMAT(printf,2,3); +extern NORETURN(fatal_perror_status(int status, const char *message, ...)) + FORMAT(printf,2,3); /* The cfgfatal() family of functions require messages that end in '\n' */ extern NORETURN(cfgfatal(struct cloc loc, cstring_t facility, - const char *message, ...)); + const char *message, ...)) FORMAT(printf,3,4); extern void cfgfile_postreadcheck(struct cloc loc, FILE *f); extern NORETURN(vcfgfatal_maybefile(FILE *maybe_f, struct cloc loc, cstring_t facility, const char *message, - va_list)); + va_list)) + FORMAT(printf,4,0); extern NORETURN(cfgfatal_maybefile(FILE *maybe_f, struct cloc loc, cstring_t facility, - const char *message, ...)); + const char *message, ...)) + FORMAT(printf,4,5); extern void Message(uint32_t class, const char *message, ...) FORMAT(printf,2,3); @@ -498,4 +527,6 @@ extern void log_from_fd(int fd, cstring_t prefix, struct log_if *log); #define STRING2(x) #x #define STRING(x) STRING2(x) +#define FILLZERO(obj) (memset(&(obj),0,sizeof((obj)))) + #endif /* secnet_h */