summaryrefslogtreecommitdiff
path: root/code/core.h
diff options
context:
space:
mode:
Diffstat (limited to 'code/core.h')
-rw-r--r--code/core.h279
1 files changed, 279 insertions, 0 deletions
diff --git a/code/core.h b/code/core.h
new file mode 100644
index 0000000..09c3a2e
--- /dev/null
+++ b/code/core.h
@@ -0,0 +1,279 @@
+#define ECP_OK 0
+#define ECP_ERR -1
+#define ECP_ERR_TIMEOUT -2
+#define ECP_ERR_ALLOC -3
+
+#define ECP_ERR_MAX_SOCK_CONN -10
+#define ECP_ERR_MAX_PTYPE -11
+#define ECP_ERR_MAX_PLD -12
+#define ECP_ERR_MIN_MSG -13
+#define ECP_ERR_NET_ADDR -14
+
+#define ECP_ERR_CONN_NOT_FOUND -20
+#define ECP_ERR_ECDH_KEY_DUP -21
+#define ECP_ERR_ECDH_IDX -22
+#define ECP_ERR_ECDH_IDX_LOCAL -23
+#define ECP_ERR_ECDH_IDX_REMOTE -24
+#define ECP_ERR_RNG -25
+#define ECP_ERR_ENCRYPT -26
+#define ECP_ERR_DECRYPT -27
+#define ECP_ERR_SEND -28
+#define ECP_ERR_RECV -29
+#define ECP_ERR_SEQ -30
+#define ECP_ERR_CLOSED -31
+#define ECP_ERR_HANDLE -32
+#define ECP_ERR_NOT_IMPLEMENTED -99
+
+#define ECP_SIZE_PROTO 2
+#define ECP_SIZE_SEQ 4
+
+#define ECP_MAX_SOCK_CONN 16
+#define ECP_MAX_SOCK_KEY 8
+#define ECP_MAX_CONN_KEY 2
+#define ECP_MAX_NODE_KEY 2
+#define ECP_MAX_PTYPE 32
+#define ECP_MAX_PTYPE_SYS 4
+
+#define ECP_SIZE_PKT_HDR (ECP_SIZE_PROTO+1+ECP_ECDH_SIZE_KEY+ECP_AEAD_SIZE_NONCE)
+#define ECP_SIZE_PLD_HDR (ECP_SIZE_SEQ+1)
+
+#define ECP_MIN_MSG 16
+#define ECP_MAX_PKT 1412
+#define ECP_MIN_PKT (ECP_SIZE_PKT_HDR+ECP_SIZE_PLD_HDR+ECP_MIN_MSG+ECP_AEAD_SIZE_TAG)
+#define ECP_MAX_PLD (ECP_MAX_PKT-ECP_SIZE_PKT_HDR-ECP_SIZE_PLD_HDR-ECP_AEAD_SIZE_TAG)
+#define ECP_MIN_PLD ECP_SIZE_PLD_HDR+ECP_MIN_MSG
+
+#define ECP_POLL_TIMEOUT 500
+#define ECP_ECDH_IDX_INV 0xFF
+#define ECP_ECDH_IDX_PERMA 0x0F
+
+#define ECP_PTYPE_OPEN 0x00
+#define ECP_PTYPE_KGET 0x01
+#define ECP_PTYPE_KPUT 0x02
+
+#define ECP_SIZE_PLD(X) (X+ECP_SIZE_PLD_HDR)
+
+#define ECP_CONN_FLAG_REG 0x01
+#define ECP_CONN_FLAG_OPEN 0x02
+
+#define ecp_conn_is_reg(conn) ((conn->flags) & ECP_CONN_FLAG_REG)
+#define ecp_conn_is_open(conn) ((conn->flags) & ECP_CONN_FLAG_OPEN)
+
+#include "config.h"
+
+#include <stddef.h>
+typedef long ssize_t;
+
+#ifdef ECP_WITH_PTHREAD
+#include <pthread.h>
+#include "msgq.h"
+#endif
+
+#include "posix/transport.h"
+#include "crypto/crypto.h"
+#include "timer.h"
+
+#ifdef ECP_DEBUG
+#include <stdio.h>
+#define DPRINT(cnd, format, ...) { if (cnd) { fprintf (stderr, format, __VA_ARGS__); } }
+#else
+#define DPRINT(cnd, format, ...) {}
+#endif
+
+struct ECPContext;
+struct ECPConnection;
+
+typedef int ecp_rng_t (void *, size_t);
+typedef struct ECPConnection * ecp_conn_alloc_t (void);
+typedef void ecp_conn_free_t (struct ECPConnection *);
+typedef int ecp_conn_create_t (struct ECPConnection *, unsigned char *, size_t);
+typedef void ecp_conn_destroy_t (struct ECPConnection *);
+typedef ssize_t ecp_conn_handler_t (struct ECPConnection *, unsigned char, unsigned char *, ssize_t);
+
+typedef struct ECPCryptoIface {
+ int init;
+ int (*dh_mkpair) (ecp_dh_public_t *p, ecp_dh_private_t *s, ecp_rng_t *rb);
+ int (*dh_shsec) (ecp_aead_key_t *sh, ecp_dh_public_t *p, ecp_dh_private_t *s);
+ unsigned char *(*dh_pub_get_buf) (ecp_dh_public_t *p);
+ void (*dh_pub_to_buf) (unsigned char *b, ecp_dh_public_t *p);
+ void (*dh_pub_from_buf) (ecp_dh_public_t *p, unsigned char *b);
+ int (*dh_pub_eq) (unsigned char *p1, ecp_dh_public_t *p2);
+ unsigned int (*dh_pub_hash_fn) (unsigned char *p);
+ int (*dh_pub_hash_eq) (unsigned char *p1, unsigned char *p2);
+
+ ssize_t (*aead_enc) (unsigned char *ct, size_t cl, unsigned char *pt, size_t pl, ecp_aead_key_t *k, unsigned char *n);
+ ssize_t (*aead_dec) (unsigned char *pt, size_t pl, unsigned char *ct, size_t cl, ecp_aead_key_t *k, unsigned char *n);
+ int (*dsa_mkpair) (ecp_dsa_public_t *p, ecp_dsa_private_t *s, ecp_rng_t *rb);
+ int (*dsa_sign) (unsigned char *sig, unsigned char *m, size_t ml, ecp_dsa_public_t *p, ecp_dsa_private_t *s);
+ int (*dsa_verify) (unsigned char *m, size_t ml, unsigned char *sig, ecp_dsa_public_t *p);
+} ECPCryptoIface;
+
+typedef struct ECPHTableIface {
+ int init;
+ void *(*create) (struct ECPContext *c);
+ void (*destroy) (void *t);
+ int (*insert) (void *t, unsigned char *k, struct ECPConnection *v);
+ struct ECPConnection *(*remove) (void *t, unsigned char *k);
+ struct ECPConnection *(*search) (void *t, unsigned char *k);
+} ECPHTableIface;
+
+typedef struct ECPTransportIface {
+ int init;
+ int (*open) (ECPNetSock *, void *addr);
+ void (*close) (ECPNetSock *);
+ int (*poll) (ECPNetSock *, int);
+ ssize_t (*send) (ECPNetSock *, void *, size_t, ECPNetAddr *);
+ ssize_t (*recv) (ECPNetSock *, void *, size_t, ECPNetAddr *);
+ int (*addr_eq) (ECPNetAddr *, ECPNetAddr *);
+ int (*addr_set) (ECPNetAddr *, void *addr);
+} ECPTransportIface;
+
+typedef struct ECPTimeIface {
+ int init;
+ unsigned int (*abstime_ms) (unsigned int);
+ void (*sleep_ms) (unsigned int);
+} ECPTimeIface;
+
+typedef struct ECPDHKey {
+ ecp_dh_public_t public;
+ ecp_dh_private_t private;
+ unsigned char valid;
+} ECPDHKey;
+
+typedef struct ECPDHRKey {
+ unsigned char idx;
+ ecp_dh_public_t public;
+} ECPDHRKey;
+
+typedef struct ECPDHShared {
+ ecp_aead_key_t secret;
+ unsigned char valid;
+} ECPDHShared;
+
+typedef struct ECPDHRKeyBucket {
+ ECPDHRKey key[ECP_MAX_NODE_KEY];
+ unsigned char key_curr;
+ unsigned char key_idx_map[ECP_MAX_SOCK_KEY];
+} ECPDHRKeyBucket;
+
+typedef struct ECPNode {
+ ECPNetAddr addr;
+ ecp_dh_public_t public;
+} ECPNode;
+
+typedef struct ECPConnHandler {
+ ecp_conn_handler_t *f[ECP_MAX_PTYPE];
+} ECPConnHandler;
+
+typedef struct ECPSockCTable {
+ struct ECPConnection *array[ECP_MAX_SOCK_CONN];
+ unsigned short size;
+ void *htable;
+#ifdef ECP_WITH_PTHREAD
+ pthread_mutex_t mutex;
+#endif
+} ECPSockCTable;
+
+typedef struct ECPContext {
+ ecp_rng_t *rng;
+ ecp_conn_alloc_t *conn_alloc;
+ ecp_conn_free_t *conn_free;
+ ECPCryptoIface cr;
+ ECPHTableIface ht;
+ ECPTransportIface tr;
+ ECPTimeIface tm;
+} ECPContext;
+
+typedef struct ECPSocket {
+ ECPContext *ctx;
+ unsigned char running;
+ unsigned int poll_timeout;
+ ECPNetSock sock;
+ ECPDHKey key_perma;
+ ECPDHKey key[ECP_MAX_SOCK_KEY];
+ unsigned char key_curr;
+ ECPSockCTable conn;
+ ECPTimer timer;
+ ecp_conn_handler_t *handler[ECP_MAX_PTYPE_SYS];
+ ecp_conn_create_t *conn_create;
+ ecp_conn_destroy_t *conn_destroy;
+#ifdef ECP_WITH_PTHREAD
+ pthread_t rcvr_thd;
+ pthread_mutex_t mutex;
+#endif
+} ECPSocket;
+
+typedef struct ECPConnection {
+ unsigned char out;
+ unsigned char flags;
+ unsigned short refcount;
+ uint32_t seq_out;
+ uint32_t seq_in;
+ uint32_t seq_in_bitmap;
+ ECPSocket *sock;
+ ECPNode node;
+ ECPDHRKeyBucket remote;
+ ECPDHKey key[ECP_MAX_CONN_KEY];
+ unsigned char key_curr;
+ unsigned char key_idx[ECP_MAX_NODE_KEY];
+ unsigned char key_idx_curr;
+ unsigned char key_idx_map[ECP_MAX_SOCK_KEY];
+ ECPDHShared shared[ECP_MAX_NODE_KEY][ECP_MAX_NODE_KEY];
+ unsigned char nonce[ECP_AEAD_SIZE_NONCE];
+ ECPConnHandler *handler;
+#ifdef ECP_WITH_PTHREAD
+ ECPConnMsgQ msgq;
+ pthread_mutex_t mutex;
+#endif
+ void *conn_data;
+} ECPConnection;
+
+int ecp_init(ECPContext *ctx);
+int ecp_crypto_init(ECPCryptoIface *t);
+int ecp_htable_init(ECPHTableIface *h);
+int ecp_transport_init(ECPTransportIface *t);
+int ecp_time_init(ECPTimeIface *t);
+
+int ecp_dhkey_generate(ECPContext *ctx, ECPDHKey *key);
+int ecp_node_init(ECPContext *ctx, ECPNode *node, void *addr, ecp_dh_public_t *public);
+ssize_t ecp_pack(ECPContext *ctx, unsigned char *packet, size_t pkt_size, unsigned char s_idx, unsigned char c_idx, ecp_dh_public_t *public, ecp_aead_key_t *shsec, unsigned char *nonce, unsigned char *seq, unsigned char *payload, size_t payload_size);
+
+int ecp_ctx_create(ECPContext *ctx);
+int ecp_ctx_destroy(ECPContext *ctx);
+
+int ecp_sock_create(ECPSocket *sock, ECPContext *ctx, ECPDHKey *key);
+void ecp_sock_destroy(ECPSocket *sock);
+int ecp_sock_open(ECPSocket *sock, void *myaddr);
+void ecp_sock_close(ECPSocket *sock);
+int ecp_sock_dhkey_get_curr(ECPSocket *sock, unsigned char *idx, unsigned char *public);
+int ecp_sock_dhkey_new(ECPSocket *sock);
+
+int ecp_conn_create(ECPConnection *conn, ECPSocket *sock);
+void ecp_conn_destroy(ECPConnection *conn);
+int ecp_conn_register(ECPConnection *conn);
+int ecp_conn_unregister(ECPConnection *conn, unsigned int timeout);
+int ecp_conn_open(ECPConnection *conn, ECPNode *node, ECPConnHandler *handler);
+int ecp_conn_close(ECPConnection *conn, unsigned int timeout);
+int ecp_conn_hander_init(ECPConnHandler *handler);
+int ecp_conn_dhkey_get_curr(ECPConnection *conn, unsigned char *idx, unsigned char *public);
+int ecp_conn_dhkey_new(ECPConnection *conn);
+int ecp_conn_dhkey_new_pub(ECPConnection *conn, unsigned char idx, unsigned char *public);
+ssize_t ecp_conn_pack(ECPConnection *conn, ECPNetAddr *addr, unsigned char *packet, size_t pkt_size, unsigned char s_idx, unsigned char c_idx, unsigned char *payload, size_t payload_size);
+
+ssize_t ecp_pkt_handle(ECPSocket *sock, ECPNetAddr *addr, unsigned char *packet, size_t pkt_size);
+ssize_t ecp_pkt_send(ECPSocket *sock, ECPNetAddr *addr, unsigned char *packet, size_t pkt_size);
+ssize_t ecp_pkt_recv(ECPSocket *sock, ECPNetAddr *addr, unsigned char *packet, size_t pkt_size);
+
+ssize_t ecp_pld_handle(ECPConnection *conn, unsigned char *payload, size_t payload_size);
+unsigned char *ecp_pld_get_buf(unsigned char *payload);
+void ecp_pld_set_type(unsigned char *payload, unsigned char ptype);
+ssize_t ecp_pld_send(ECPConnection *conn, unsigned char *payload, size_t payload_size);
+ssize_t ecp_pld_send_wkey(ECPConnection *conn, unsigned char s_idx, unsigned char c_idx, unsigned char *payload, size_t payload_size);
+ssize_t ecp_pld_send_raw(ECPSocket *sock, ECPNetAddr *addr, unsigned char s_idx, unsigned char c_idx, ecp_dh_public_t *public, ecp_aead_key_t *shsec, unsigned char *nonce, unsigned char *seq, unsigned char *payload, size_t payload_size);
+
+ssize_t ecp_send(ECPConnection *conn, unsigned char ptype, unsigned char *payload, size_t payload_size);
+ssize_t ecp_receive(ECPConnection *conn, unsigned char ptype, unsigned char *payload, size_t payload_size, unsigned int timeout);
+
+int ecp_receiver(ECPSocket *sock);
+int ecp_start_receiver(ECPSocket *sock);
+int ecp_stop_receiver(ECPSocket *sock);