void http_simple_local_data_init(http_simple_local_data* local) { local->has_sent_header = 0; local->has_recv_header = 0; local->encode_buffer = NULL; if (g_useragent_index == -1) { g_useragent_index = xorshift128plus() % (sizeof(g_useragent) / sizeof(*g_useragent)); } }
int auth_simple_pack_data(char *data, int datalength, char *outdata) { unsigned char rand_len = (xorshift128plus() & 0xF) + 1; int out_size = rand_len + datalength + 6; outdata[0] = out_size >> 8; outdata[1] = out_size; outdata[2] = rand_len; memmove(outdata + rand_len + 2, data, datalength); fillcrc32((unsigned char *)outdata, out_size); return out_size; }
int http_simple_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) { char *encryptdata = *pencryptdata; http_simple_local_data *local = (http_simple_local_data*)self->l_data; if (local->has_sent_header) { return datalength; } char hostport[128]; int head_size = self->server.head_len + (xorshift128plus() & 0x3F); int outlength; char * out_buffer = (char*)malloc(datalength + 2048); if (head_size > datalength) head_size = datalength; http_simple_encode_head(local, encryptdata, head_size); if (self->server.param && strlen(self->server.param) == 0) self->server.param = NULL; if (self->server.port == 80) sprintf(hostport, "%s", (self->server.param ? self->server.param : self->server.host)); else sprintf(hostport, "%s:%d", (self->server.param ? self->server.param : self->server.host), self->server.port); sprintf(out_buffer, "GET /%s HTTP/1.1\r\n" "Host: %s\r\n" "User-Agent: %s\r\n" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" "Accept-Language: en-US,en;q=0.8\r\n" "Accept-Encoding: gzip, deflate\r\n" "DNT: 1\r\n" "Connection: keep-alive\r\n" "\r\n", local->encode_buffer, hostport, "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0" ); outlength = strlen(out_buffer); memmove(out_buffer + outlength, encryptdata + head_size, datalength - head_size); outlength += datalength - head_size; local->has_sent_header = 1; if (*capacity < outlength) { *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2); encryptdata = *pencryptdata; } memmove(encryptdata, out_buffer, outlength); free(out_buffer); if (local->encode_buffer != NULL) { free(local->encode_buffer); local->encode_buffer = NULL; } return outlength; }
int main(int argc, char** argv) { uint64_t t1, t2; t1 = ticks(); for (int i = 0; i < 10000000; i++) xorshift128plus(); t2 = ticks(); printf("%ld ms\n", t2 - t1); #ifdef WIN64 printf("state0 = %llu\n", state0); printf("state1 = %llu\n", state1); #else printf("state0 = %lu\n", state0); printf("state1 = %lu\n", state1); #endif }
int tls12_ticket_auth_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) { char *encryptdata = *pencryptdata; tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data; tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)self->server.g_data; char * out_buffer = NULL; if (local->handshake_status == 8) { if (datalength < 1024) { if (*capacity < datalength + 5) { *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (datalength + 5) * 2); encryptdata = *pencryptdata; } memmove(encryptdata + 5, encryptdata, datalength); encryptdata[0] = 0x17; encryptdata[1] = 0x3; encryptdata[2] = 0x3; encryptdata[3] = datalength >> 8; encryptdata[4] = datalength; return datalength + 5; } else { out_buffer = (char*)malloc(datalength + 2048); int start = 0; int outlength = 0; int len; while (datalength - start > 2048) { len = xorshift128plus() % 4096 + 100; if (len > datalength - start) len = datalength - start; tls12_ticket_auth_pack_data(encryptdata, datalength, start, len, out_buffer, outlength); outlength += len + 5; start += len; } if (datalength - start > 0) { len = datalength - start; tls12_ticket_auth_pack_data(encryptdata, datalength, start, len, out_buffer, outlength); outlength += len + 5; } if (*capacity < outlength) { *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2); encryptdata = *pencryptdata; } memcpy(encryptdata, out_buffer, outlength); free(out_buffer); return outlength; } }
int auth_sha1_v2_pack_data(char *data, int datalength, char *outdata) { unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1; int out_size = rand_len + datalength + 6; outdata[0] = out_size >> 8; outdata[1] = out_size; if (rand_len < 128) { outdata[2] = rand_len; } else { outdata[2] = 0xFF; outdata[3] = rand_len >> 8; outdata[4] = rand_len; } memmove(outdata + rand_len + 2, data, datalength); filladler32((unsigned char *)outdata, out_size); return out_size; }
int auth_simple_pack_auth_data(auth_simple_global_data *global, char *data, int datalength, char *outdata) { unsigned char rand_len = (xorshift128plus() & 0xF) + 1; int out_size = rand_len + datalength + 6 + 12; outdata[0] = out_size >> 8; outdata[1] = out_size; outdata[2] = rand_len; ++global->connection_id; if (global->connection_id > 0xFF000000) { rand_bytes(global->local_client_id, 8); rand_bytes((uint8_t*)&global->connection_id, 4); global->connection_id &= 0xFFFFFF; } time_t t = time(NULL); memintcopy_lt(outdata + rand_len + 2, t); memmove(outdata + rand_len + 2 + 4, global->local_client_id, 4); memintcopy_lt(outdata + rand_len + 2 + 8, global->connection_id); memmove(outdata + rand_len + 2 + 12, data, datalength); fillcrc32((unsigned char *)outdata, out_size); return out_size; }
int auth_sha1_v4_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) { unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1; int data_offset = rand_len + 4 + 2; int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN; const char* salt = "auth_sha1_v4"; int salt_len = strlen(salt); unsigned char *crc_salt = (unsigned char*)malloc(salt_len + server->key_len + 2); crc_salt[0] = outdata[0] = out_size >> 8; crc_salt[1] = outdata[1] = out_size; memcpy(crc_salt + 2, salt, salt_len); memcpy(crc_salt + salt_len + 2, server->key, server->key_len); fillcrc32to(crc_salt, salt_len + server->key_len + 2, (unsigned char *)outdata + 2); free(crc_salt); if (rand_len < 128) { outdata[6] = rand_len; } else { outdata[6] = 0xFF; outdata[7] = rand_len >> 8; outdata[8] = rand_len; } ++global->connection_id; if (global->connection_id > 0xFF000000) { rand_bytes(global->local_client_id, 8); rand_bytes((uint8_t*)&global->connection_id, 4); global->connection_id &= 0xFFFFFF; } time_t t = time(NULL); memintcopy_lt(outdata + data_offset, t); memmove(outdata + data_offset + 4, global->local_client_id, 4); memintcopy_lt(outdata + data_offset + 8, global->connection_id); memmove(outdata + data_offset + 12, data, datalength); char hash[ONETIMEAUTH_BYTES * 2]; ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv); memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN); return out_size; }
int auth_sha1_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) { unsigned char rand_len = (xorshift128plus() & 0x7F) + 1; int data_offset = rand_len + 4 + 2; int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN; fillcrc32to((unsigned char *)server->key, server->key_len, (unsigned char *)outdata); outdata[4] = out_size >> 8; outdata[5] = out_size; outdata[6] = rand_len; ++global->connection_id; if (global->connection_id > 0xFF000000) { rand_bytes(global->local_client_id, 8); rand_bytes((uint8_t*)&global->connection_id, 4); global->connection_id &= 0xFFFFFF; } time_t t = time(NULL); memintcopy_lt(outdata + data_offset, t); memmove(outdata + data_offset + 4, global->local_client_id, 4); memintcopy_lt(outdata + data_offset + 8, global->connection_id); memmove(outdata + data_offset + 12, data, datalength); char hash[ONETIMEAUTH_BYTES * 2]; ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv); memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN); return out_size; }
int http_simple_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) { char *encryptdata = *pencryptdata; http_simple_local_data *local = (http_simple_local_data*)self->l_data; if (local->has_sent_header) { return datalength; } char hosts[1024]; char * phost[128]; int host_num = 0; int pos; char hostport[128]; int head_size = self->server.head_len + (xorshift128plus() & 0x3F); int outlength; char * out_buffer = (char*)malloc(datalength + 2048); char * body_buffer = NULL; if (head_size > datalength) head_size = datalength; http_simple_encode_head(local, encryptdata, head_size); if (self->server.param && strlen(self->server.param) == 0) self->server.param = NULL; strncpy(hosts, self->server.param ? self->server.param : self->server.host, sizeof hosts); phost[host_num++] = hosts; for (pos = 0; hosts[pos]; ++pos) { if (hosts[pos] == ',') { phost[host_num++] = &hosts[pos + 1]; hosts[pos] = 0; } else if (hosts[pos] == '#') { char * body_pointer = &hosts[pos + 1]; char * p; int trans_char = 0; p = body_buffer = (char*)malloc(2048); for ( ; *body_pointer; ++body_pointer) { if (*body_pointer == '\\') { trans_char = 1; continue; } if (trans_char) { if (*body_pointer == '\\' ) { *p = '\\'; } else if (*body_pointer == 'n' ) { *p = '\r'; *++p = '\n'; } else { *p = '\\'; *p = *body_pointer; } trans_char = 0; } else { *p = *body_pointer; } ++p; } hosts[pos] = 0; break; } } host_num = xorshift128plus() % host_num; if (self->server.port == 80) sprintf(hostport, "%s", phost[host_num]); else sprintf(hostport, "%s:%d", phost[host_num], self->server.port); if (body_buffer) { sprintf(out_buffer, "GET /%s HTTP/1.1\r\n" "Host: %s\r\n" "%s\r\n\r\n", local->encode_buffer, hostport, body_buffer); } else { sprintf(out_buffer, "GET /%s HTTP/1.1\r\n" "Host: %s\r\n" "User-Agent: %s\r\n" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" "Accept-Language: en-US,en;q=0.8\r\n" "Accept-Encoding: gzip, deflate\r\n" "DNT: 1\r\n" "Connection: keep-alive\r\n" "\r\n", local->encode_buffer, hostport, g_useragent[g_useragent_index] ); } outlength = strlen(out_buffer); memmove(out_buffer + outlength, encryptdata + head_size, datalength - head_size); outlength += datalength - head_size; local->has_sent_header = 1; if (*capacity < outlength) { *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2); encryptdata = *pencryptdata; } memmove(encryptdata, out_buffer, outlength); free(out_buffer); if (body_buffer != NULL) free(body_buffer); if (local->encode_buffer != NULL) { free(local->encode_buffer); local->encode_buffer = NULL; } return outlength; }