|
@ -31,6 +31,7 @@ import struct |
|
|
import zlib |
|
|
import zlib |
|
|
import hmac |
|
|
import hmac |
|
|
import hashlib |
|
|
import hashlib |
|
|
|
|
|
import bisect |
|
|
|
|
|
|
|
|
import shadowsocks |
|
|
import shadowsocks |
|
|
from shadowsocks import common, lru_cache, encrypt |
|
|
from shadowsocks import common, lru_cache, encrypt |
|
@ -40,9 +41,12 @@ from shadowsocks.common import to_bytes, to_str, ord, chr |
|
|
def create_auth_chain_a(method): |
|
|
def create_auth_chain_a(method): |
|
|
return auth_chain_a(method) |
|
|
return auth_chain_a(method) |
|
|
|
|
|
|
|
|
|
|
|
def create_auth_chain_b(method): |
|
|
|
|
|
return auth_chain_b(method) |
|
|
|
|
|
|
|
|
obfs_map = { |
|
|
obfs_map = { |
|
|
'auth_chain_a': (create_auth_chain_a,), |
|
|
'auth_chain_a': (create_auth_chain_a,), |
|
|
|
|
|
'auth_chain_b': (create_auth_chain_b,), |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
class xorshift128plus(object): |
|
|
class xorshift128plus(object): |
|
@ -630,3 +634,46 @@ class auth_chain_a(auth_base): |
|
|
def dispose(self): |
|
|
def dispose(self): |
|
|
self.server_info.data.remove(self.user_id, self.client_id) |
|
|
self.server_info.data.remove(self.user_id, self.client_id) |
|
|
|
|
|
|
|
|
|
|
|
class auth_chain_b(auth_chain_a): |
|
|
|
|
|
def __init__(self, method): |
|
|
|
|
|
super(auth_chain_b, self).__init__(method) |
|
|
|
|
|
self.salt = b"auth_chain_b" |
|
|
|
|
|
self.no_compatible_method = 'auth_chain_b' |
|
|
|
|
|
self.data_size_list = [] |
|
|
|
|
|
|
|
|
|
|
|
def init_data_size(self, key): |
|
|
|
|
|
if self.data_size_list: |
|
|
|
|
|
self.data_size_list = [] |
|
|
|
|
|
random = xorshift128plus() |
|
|
|
|
|
random.init_from_bin(key) |
|
|
|
|
|
list_len = random.next() % 32 + 8; |
|
|
|
|
|
for i in range(0, list_len): |
|
|
|
|
|
self.data_size_list.append((int)(random.next() % 1440)) |
|
|
|
|
|
self.data_size_list.sort() |
|
|
|
|
|
|
|
|
|
|
|
def set_server_info(self, server_info): |
|
|
|
|
|
self.server_info = server_info |
|
|
|
|
|
try: |
|
|
|
|
|
max_client = int(server_info.protocol_param.split('#')[0]) |
|
|
|
|
|
except: |
|
|
|
|
|
max_client = 64 |
|
|
|
|
|
self.server_info.data.set_max_client(max_client) |
|
|
|
|
|
self.init_data_size(self.server_info.key) |
|
|
|
|
|
|
|
|
|
|
|
def rnd_data_len(self, buf_size, last_hash, random): |
|
|
|
|
|
if buf_size >= 1440: |
|
|
|
|
|
return 0 |
|
|
|
|
|
random.init_from_bin_len(last_hash, buf_size) |
|
|
|
|
|
pos = bisect.bisect_left(self.data_size_list, buf_size) |
|
|
|
|
|
final_pos = pos + random.next() % (len(self.data_size_list) + 1 - pos) |
|
|
|
|
|
if final_pos < len(self.data_size_list): |
|
|
|
|
|
return self.data_size_list[final_pos] - buf_size |
|
|
|
|
|
|
|
|
|
|
|
if buf_size > 1300: |
|
|
|
|
|
return random.next() % 31 |
|
|
|
|
|
if buf_size > 900: |
|
|
|
|
|
return random.next() % 127 |
|
|
|
|
|
if buf_size > 400: |
|
|
|
|
|
return random.next() % 521 |
|
|
|
|
|
return random.next() % 1021 |
|
|
|
|
|
|
|
|