From 86f4814245998f4b43e136101897557e4c2f5e54 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Mon, 20 Feb 2017 14:42:43 +0100 Subject: lib: Revise CACEP Revises CACEP policies to stateless library calls. It provides two policies: an anonymous authentication policy that will generate random credentials for the peer, and a simple authentication policy that will return a name for the peer and an address. Changes the normal IPCP to use the updates API calls. --- src/lib/cacep.c | 160 +++++++++++--------------------------------------------- 1 file changed, 30 insertions(+), 130 deletions(-) (limited to 'src/lib/cacep.c') diff --git a/src/lib/cacep.c b/src/lib/cacep.c index 00557444..3d556d8f 100644 --- a/src/lib/cacep.c +++ b/src/lib/cacep.c @@ -20,152 +20,52 @@ * 02110-1301 USA */ +#define OUROBOROS_PREFIX "cacep" + #include #include #include #include +#include + +#include +#include #include #include -#include "cacep.pb-c.h" -typedef Cacep cacep_t; - #define BUF_SIZE 2048 -struct cacep { - int fd; - char * name; - uint64_t address; -}; - -struct cacep * cacep_create(int fd, - const char * name, - uint64_t address) +struct cacep_info * cacep_auth(int fd, + enum pol_cacep pc, + const struct cacep_info * info) { - struct cacep * tmp; - - tmp = malloc(sizeof(*tmp)); - if (tmp == NULL) - return NULL; - - tmp->fd = fd; - tmp->address = address; - tmp->name = strdup(name); - if (tmp->name == NULL) { - free(tmp); + switch (pc) { + case ANONYMOUS_AUTH: + return cacep_anonymous_auth(fd, info); + case SIMPLE_AUTH: + if (info == NULL) + return NULL; + return cacep_simple_auth_auth(fd, info); + default: + log_err("Unsupported CACEP policy."); return NULL; } - - return tmp; -} - -int cacep_destroy(struct cacep * instance) -{ - if (instance == NULL) - return 0; - - free(instance->name); - free(instance); - - return 0; -} - -static struct cacep_info * read_msg(struct cacep * instance) -{ - struct cacep_info * tmp; - uint8_t buf[BUF_SIZE]; - cacep_t * msg; - ssize_t len; - - len = flow_read(instance->fd, buf, BUF_SIZE); - if (len < 0) - return NULL; - - msg = cacep__unpack(NULL, len, buf); - if (msg == NULL) - return NULL; - - tmp = malloc(sizeof(*tmp)); - if (tmp == NULL) { - cacep__free_unpacked(msg, NULL); - return NULL; - } - - tmp->addr = msg->address; - tmp->name = strdup(msg->name); - if (tmp->name == NULL) { - free(tmp); - cacep__free_unpacked(msg, NULL); - return NULL; - } - - cacep__free_unpacked(msg, NULL); - - return tmp; -} - -static int send_msg(struct cacep * instance) -{ - cacep_t msg = CACEP__INIT; - int ret = 0; - uint8_t * data = NULL; - size_t len = 0; - - msg.name = instance->name; - msg.address = instance->address; - - len = cacep__get_packed_size(&msg); - if (len == 0) - return -1; - - data = malloc(len); - if (data == NULL) - return -ENOMEM; - - cacep__pack(&msg, data); - - if (flow_write(instance->fd, data, len) < 0) - ret = -1; - - free(data); - - return ret; } -struct cacep_info * cacep_auth(struct cacep * instance) +struct cacep_info * cacep_auth_wait(int fd, + enum pol_cacep pc, + const struct cacep_info * info) { - struct cacep_info * tmp; - - if (instance == NULL) - return NULL; - - if (send_msg(instance)) - return NULL; - - tmp = read_msg(instance); - if (tmp == NULL) - return NULL; - - return tmp; -} - -struct cacep_info * cacep_auth_wait(struct cacep * instance) -{ - struct cacep_info * tmp; - - if (instance == NULL) - return NULL; - - tmp = read_msg(instance); - if (tmp == NULL) - return NULL; - - if (send_msg(instance)) { - free(tmp->name); - free(tmp); + switch (pc) { + case ANONYMOUS_AUTH: + return cacep_anonymous_auth_wait(fd, info); + case SIMPLE_AUTH: + if (info == NULL) + return NULL; + return cacep_simple_auth_auth_wait(fd, info); + default: + log_err("Unsupported CACEP policy."); return NULL; } - - return tmp; } -- cgit v1.2.3