Files
shadowsocks-android/jni/shadowsocks/encrypt.c
T
2012-12-16 11:46:43 +08:00

68 lines
1.7 KiB
C
Executable File

#include "encrypt.h"
#include "android.h"
#include <openssl/md5.h>
void encrypt(char *buf, int len) {
char *end = buf + len;
while (buf < end) {
*buf = (char)encrypt_table[(unsigned char)*buf];
buf++;
}
}
void decrypt(char *buf, int len) {
char *end = buf + len;
while (buf < end) {
*buf = (char)decrypt_table[(unsigned char)*buf];
buf++;
}
}
int send_encrypt(int sock, char *buf, int len, int flags) {
char mybuf[4096];
memcpy(mybuf, buf, len);
encrypt(mybuf, len);
return send(sock, mybuf, len, flags);
}
int recv_decrypt(int sock, char *buf, int len, int flags) {
char mybuf[4096];
int result = recv(sock, mybuf, len, flags);
memcpy(buf, mybuf, len);
decrypt(buf, len);
return result;
}
static int random_compare(const void *_x, const void *_y) {
unsigned int i = _i;
unsigned long long a = _a;
unsigned char x = *((unsigned char*) _x);
unsigned char y = *((unsigned char*) _y);
return (a % (x + i) - a % (y + i));
}
void get_table(const char* key) {
unsigned char *table = encrypt_table;
unsigned char *tmp_hash;
tmp_hash = MD5((const unsigned char*)key, strlen(key), NULL);
_a = *(unsigned long long *)tmp_hash;
unsigned int i;
LOGD("key hash: %lld", _a);
for(i = 0; i < 256; ++i) {
table[i] = i;
}
for(i = 1; i < 1024; ++i) {
// use bubble sort in order to keep the array stable as in Python
unsigned char t;
_i = i;
qsort(table, 256, sizeof(unsigned char), random_compare);
}
for(i = 0; i < 256; ++i) {
// gen decrypt table from encrypt table
decrypt_table[encrypt_table[i]] = i;
}
}