2 Easy async socket library
3 Copyright (C) 2004-2007 Chris Porter.
9 #include "../lib/rijndael.h"
10 #include "../lib/sha2.h"
11 #include "../lib/hmac.h"
12 #include "../lib/cbc.h"
14 #include <sys/types.h>
17 #define ESOCKET_UNIX_DOMAIN ESOCKET_LISTENING
18 #define ESOCKET_UNIX_DOMAIN_CONNECTED ESOCKET_INCOMING
19 #define ESOCKET_TCP_LISTENING ESOCKET_LISTENING
20 #define ESOCKET_INCOMING_TCP ESOCKET_INCOMING
21 #define ESOCKET_OUTGOING_TCP ESOCKET_OUTGOING
22 #define ESOCKET_OUTGOING_TCP_CONNECTED ESOCKET_OUTGOING_CONNECTED
24 #define ESOCKET_LISTENING 1
25 #define ESOCKET_OUTGOING 2
26 #define ESOCKET_INCOMING 3
27 #define ESOCKET_OUTGOING_CONNECTED 4
29 #define ST_CONNECTING 1
30 #define ST_CONNECTED 2
31 #define ST_LISTENING 3
32 #define ST_DISCONNECT 4
38 #define BUF_OVERFLOW -2
43 #define PARSE_CRYPTO 1
45 #define MAX_BUFSIZE 50000
47 #define USED_MAC_LEN 16
49 typedef unsigned short packet_t
;
51 #define MAX_BINARY_LINE_SIZE MAX_BUFSIZE
52 #define MAX_ASCII_LINE_SIZE MAX_BINARY_LINE_SIZE - 10 - USED_MAC_LEN
54 #define MAX_OUT_QUEUE_SIZE 5000
59 typedef int (*parse_event
)(struct esocket
*sock
);
61 typedef int (*line_event
)(struct esocket
*sock
, char *newline
);
63 typedef struct esocket_in_buffer
{
67 unsigned char *cryptobuf
;
72 typedef struct esocket_packet
{
76 struct esocket_packet
*next
;
79 typedef struct esocket_out_buffer
{
80 struct esocket_packet
*head
;
81 struct esocket_packet
*end
;
85 typedef void (*esocket_event
)(struct esocket
*socket
);
87 typedef struct esocket_events
{
88 esocket_event on_connect
;
89 esocket_event on_accept
;
90 esocket_event on_disconnect
;
94 typedef struct esocket
{
96 struct esocket_in_buffer in
;
97 struct esocket_out_buffer out
;
100 struct esocket_events events
;
101 struct esocket
*next
;
102 unsigned short token
;
105 unsigned char clientrawkey
[32], serverrawkey
[32];
106 unsigned char clienthmackey
[32], serverhmackey
[32];
107 u_int64_t clientseqno
, serverseqno
;
108 u_int64_t clientkeyno
, serverkeyno
;
110 hmacsha256 clienthmac
;
111 rijndaelcbc
*clientcrypto
;
112 rijndaelcbc
*servercrypto
;
115 struct esocket
*esocket_add(int fd
, char socket_type
, struct esocket_events
*events
, unsigned short token
);
116 struct esocket
*find_esocket_from_fd(int fd
);
117 void esocket_poll_event(int fd
, short events
);
118 void esocket_disconnect(struct esocket
*active
);
119 int buffer_parse_ascii(struct esocket
*sock
);
120 int esocket_read(struct esocket
*sock
);
121 int esocket_write(struct esocket
*sock
, char *buffer
, int bytes
);
122 int esocket_write_line(struct esocket
*sock
, char *format
, ...) __attribute__ ((format (printf
, 2, 3)));
123 unsigned short esocket_token(void);
124 struct esocket
*find_esocket_from_fd(int fd
);
125 void esocket_clean_by_token(unsigned short token
);
126 void switch_buffer_mode(struct esocket
*sock
, unsigned char *serverkey
, unsigned char *serveriv
, unsigned char *clientkey
, unsigned char *clientiv
);
127 void esocket_disconnect_when_complete(struct esocket
*active
);
128 int esocket_raw_write(struct esocket
*sock
, char *buffer
, int bytes
);
133 #error No byte order defined!
135 #define BYTE_ORDER __BYTE_ORDER
138 #define BYTE_ORDER _BYTE_ORDER
143 #if BYTE_ORDER == BIG_ENDIAN
147 #define htonq(x) ntohq(x)
148 #define ntohq(x) (((u_int64_t)htonl((x)>>32))|(((u_int64_t)htonl(x))<<32))