-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrelay.c
79 lines (68 loc) · 2.19 KB
/
relay.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "def.h"
#include "helper.h"
#include "server.h"
#include "crypto.h"
#include "log.h"
struct settings settings;
static void relay_streamcb(struct bufferevent *bev, void *ctx);
void evs_setcb_for_local(struct bufferevent *bev, void *context)
{
bufferevent_setcb(bev, fast_streamcb, NULL, eventcb, context);
}
void fast_streamcb(struct bufferevent *bev, void *ctx)
{
struct e_context_s *context = ctx;
struct bufferevent *partner = context->partner;
struct evbuffer *src = bufferevent_get_input(bev);
size_t buf_size = evbuffer_get_length(src);
u8 buf[buf_size];
u8 enc_buf[SOCKS_MAX_BUFFER_SIZE];
int buflen;
if (!partner || !buf_size) {
evbuffer_drain(src, buf_size);
return;
}
evbuffer_copyout(src, buf, buf_size);
evbuffer_drain(src, buf_size);
if (context->st == e_connected && context->partner) {
// enc
buflen = openssl_encrypt(context->evp_cipher_ctx, enc_buf, buf, buf_size);
if (bufferevent_write(partner, enc_buf, buflen) != 0) {
log_e("failed to write");
context->st = e_destroy;
} else {
context->reversed = true;
// Keep doing proxy until there is no data
bufferevent_setcb(partner, relay_streamcb, NULL, eventcb, context);
bufferevent_enable(partner, EV_READ|EV_WRITE);
}
}
}
static void relay_streamcb(struct bufferevent *bev, void *ctx)
{
struct e_context_s *context = ctx;
struct bufferevent *partner = context->bev;
struct evbuffer *src = bufferevent_get_input(bev);
int buflen;
size_t buf_size = evbuffer_get_length(src);
u8 buf[buf_size];
u8 dec_buf[SOCKS_MAX_BUFFER_SIZE];
if (!partner || !buf_size) {
evbuffer_drain(src, buf_size);
return;
}
if (context->st == e_connected && buf_size && context->partner) {
// dec
evbuffer_copyout(src, buf, buf_size);
evbuffer_drain(src, buf_size);
buflen = openssl_decrypt(context->evp_decipher_ctx, dec_buf, buf, buf_size);
if (bufferevent_write(partner, dec_buf, buflen) != 0) {
log_e("failed to write");
context->st = e_destroy;
} else {
// Keep doing proxy until there is no data
bufferevent_setcb(bev, relay_streamcb, NULL, eventcb, context);
bufferevent_enable(bev, EV_READ|EV_WRITE);
}
}
}