From 38ef6a25467a0ed8bad1e4b43831a6dcf0cc8faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=B4=E5=A8=83=E9=85=B1?= Date: Wed, 26 Jul 2017 07:47:28 +0800 Subject: [PATCH] add auth_chain_b --- shadowsocks/obfsplugin/auth_chain.py | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/shadowsocks/obfsplugin/auth_chain.py b/shadowsocks/obfsplugin/auth_chain.py index 5eed68c..c0ced3e 100644 --- a/shadowsocks/obfsplugin/auth_chain.py +++ b/shadowsocks/obfsplugin/auth_chain.py @@ -31,6 +31,7 @@ import struct import zlib import hmac import hashlib +import bisect import shadowsocks 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): return auth_chain_a(method) +def create_auth_chain_b(method): + return auth_chain_b(method) obfs_map = { 'auth_chain_a': (create_auth_chain_a,), + 'auth_chain_b': (create_auth_chain_b,), } class xorshift128plus(object): @@ -630,3 +634,46 @@ class auth_chain_a(auth_base): def dispose(self): 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 +