openwrt_helloworld/shadowsocksr-libev/src/server/obfs.c
2022-04-17 03:50:24 +08:00

206 lines
7.7 KiB
C

#include <string.h>
#include <stdlib.h>
#include "utils.h"
#include "obfs.h"
int rand_bytes(uint8_t *output, int len);
#define OBFS_HMAC_SHA1_LEN 10
#include "obfsutil.c"
#include "crc32.c"
#include "base64.c"
#include "http_simple.c"
#include "tls1.2_ticket.c"
#include "verify.c"
#include "auth.c"
void * init_data() {
return malloc(1);
}
obfs * new_obfs() {
obfs * self = (obfs*)malloc(sizeof(obfs));
self->l_data = NULL;
return self;
}
void set_server_info(obfs *self, server_info *server) {
memmove(&self->server, server, sizeof(server_info));
}
void get_server_info(obfs *self, server_info *server) {
memmove(server, &self->server, sizeof(server_info));
}
void dispose_obfs(obfs *self) {
free(self);
}
obfs_class * new_obfs_class(char *plugin_name)
{
if (plugin_name == NULL)
return NULL;
if (strcmp(plugin_name, "origin") == 0)
return NULL;
if (strcmp(plugin_name, "plain") == 0)
return NULL;
init_crc32_table();
init_shift128plus();
if (strcmp(plugin_name, "http_simple") == 0) {
obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));
plugin->init_data = init_data;
plugin->new_obfs = http_simple_new_obfs;
plugin->get_server_info = get_server_info;
plugin->set_server_info = set_server_info;
plugin->dispose = http_simple_dispose;
plugin->client_encode = http_simple_client_encode;
plugin->client_decode = http_simple_client_decode;
plugin->server_encode = http_simple_server_encode;
plugin->server_decode = http_simple_server_decode;
return plugin;
} else if (strcmp(plugin_name, "http_post") == 0) {
obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));
plugin->init_data = init_data;
plugin->new_obfs = http_simple_new_obfs;
plugin->get_server_info = get_server_info;
plugin->set_server_info = set_server_info;
plugin->dispose = http_simple_dispose;
plugin->client_encode = http_post_client_encode;
plugin->client_decode = http_simple_client_decode;
plugin->server_encode = http_simple_server_encode;
plugin->server_decode = http_simple_server_decode;
return plugin;
} else if (strcmp(plugin_name, "tls1.2_ticket_auth") == 0) {
obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));
plugin->init_data = tls12_ticket_auth_init_data;
plugin->new_obfs = tls12_ticket_auth_new_obfs;
plugin->get_server_info = get_server_info;
plugin->set_server_info = set_server_info;
plugin->dispose = tls12_ticket_auth_dispose;
plugin->client_encode = tls12_ticket_auth_client_encode;
plugin->client_decode = tls12_ticket_auth_client_decode;
plugin->server_encode = tls12_ticket_auth_server_encode;
plugin->server_decode = tls12_ticket_auth_server_decode;
return plugin;
} else if (strcmp(plugin_name, "verify_simple") == 0) {
obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));
plugin->init_data = init_data;
plugin->new_obfs = verify_simple_new_obfs;
plugin->get_server_info = get_server_info;
plugin->set_server_info = set_server_info;
plugin->dispose = verify_simple_dispose;
plugin->client_pre_encrypt = verify_simple_client_pre_encrypt;
plugin->client_post_decrypt = verify_simple_client_post_decrypt;
plugin->client_udp_pre_encrypt = NULL;
plugin->client_udp_post_decrypt = NULL;
plugin->server_pre_encrypt = verify_simple_server_pre_encrypt;
plugin->server_post_decrypt = verify_simple_server_post_decrypt;
plugin->server_udp_pre_encrypt = NULL;
plugin->server_udp_post_decrypt = NULL;
return plugin;
} else if (strcmp(plugin_name, "auth_simple") == 0) {
obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));
plugin->init_data = auth_simple_init_data;
plugin->new_obfs = auth_simple_new_obfs;
plugin->get_server_info = get_server_info;
plugin->set_server_info = set_server_info;
plugin->dispose = auth_simple_dispose;
plugin->client_pre_encrypt = auth_simple_client_pre_encrypt;
plugin->client_post_decrypt = auth_simple_client_post_decrypt;
plugin->client_udp_pre_encrypt = NULL;
plugin->client_udp_post_decrypt = NULL;
return plugin;
} else if (strcmp(plugin_name, "auth_sha1") == 0) {
obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));
plugin->init_data = auth_simple_init_data;
plugin->new_obfs = auth_simple_new_obfs;
plugin->get_server_info = get_server_info;
plugin->set_server_info = set_server_info;
plugin->dispose = auth_simple_dispose;
plugin->client_pre_encrypt = auth_sha1_client_pre_encrypt;
plugin->client_post_decrypt = auth_sha1_client_post_decrypt;
plugin->client_udp_pre_encrypt = NULL;
plugin->client_udp_post_decrypt = NULL;
return plugin;
} else if (strcmp(plugin_name, "auth_sha1_v2") == 0) {
obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));
plugin->init_data = auth_simple_init_data;
plugin->new_obfs = auth_simple_new_obfs;
plugin->get_server_info = get_server_info;
plugin->set_server_info = set_server_info;
plugin->dispose = auth_simple_dispose;
plugin->client_pre_encrypt = auth_sha1_v2_client_pre_encrypt;
plugin->client_post_decrypt = auth_sha1_v2_client_post_decrypt;
plugin->client_udp_pre_encrypt = NULL;
plugin->client_udp_post_decrypt = NULL;
return plugin;
} else if (strcmp(plugin_name, "auth_sha1_v4") == 0) {
obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));
plugin->init_data = auth_simple_init_data;
plugin->new_obfs = auth_simple_new_obfs;
plugin->get_server_info = get_server_info;
plugin->set_server_info = set_server_info;
plugin->dispose = auth_simple_dispose;
plugin->client_pre_encrypt = auth_sha1_v4_client_pre_encrypt;
plugin->client_post_decrypt = auth_sha1_v4_client_post_decrypt;
plugin->client_udp_pre_encrypt = NULL;
plugin->client_udp_post_decrypt = NULL;
return plugin;
} else if (strcmp(plugin_name, "auth_aes128_md5") == 0) {
obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));
plugin->init_data = auth_simple_init_data;
plugin->new_obfs = auth_aes128_md5_new_obfs;
plugin->get_server_info = get_server_info;
plugin->set_server_info = set_server_info;
plugin->dispose = auth_simple_dispose;
plugin->client_pre_encrypt = auth_aes128_sha1_client_pre_encrypt;
plugin->client_post_decrypt = auth_aes128_sha1_client_post_decrypt;
plugin->client_udp_pre_encrypt = auth_aes128_sha1_client_udp_pre_encrypt;
plugin->client_udp_post_decrypt = auth_aes128_sha1_client_udp_post_decrypt;
return plugin;
} else if (strcmp(plugin_name, "auth_aes128_sha1") == 0) {
obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));
plugin->init_data = auth_simple_init_data;
plugin->new_obfs = auth_aes128_sha1_new_obfs;
plugin->get_server_info = get_server_info;
plugin->set_server_info = set_server_info;
plugin->dispose = auth_simple_dispose;
plugin->client_pre_encrypt = auth_aes128_sha1_client_pre_encrypt;
plugin->client_post_decrypt = auth_aes128_sha1_client_post_decrypt;
plugin->client_udp_pre_encrypt = auth_aes128_sha1_client_udp_pre_encrypt;
plugin->client_udp_post_decrypt = auth_aes128_sha1_client_udp_post_decrypt;
return plugin;
}
LOGE("Load obfs '%s' failed", plugin_name);
return NULL;
}
void free_obfs_class(obfs_class *plugin) {
free(plugin);
}