2525import base64
2626import datetime
2727import struct
28+ import zlib
2829
29- from shadowsocks . obfsplugin import plain
30+ import shadowsocks
3031from shadowsocks import common
32+ from shadowsocks .obfsplugin import plain
3133from shadowsocks .common import to_bytes , to_str , ord
3234
3335def create_verify_obfs (method ):
3436 return verify_simple (method )
3537
36- obfs = {
38+ def create_verify_deflate (method ):
39+ return verify_deflate (method )
40+
41+ obfs_map = {
3742 'verify_simple' : (create_verify_obfs ,),
43+ 'verify_deflate' : (create_verify_deflate ,),
3844}
3945
4046def match_begin (str1 , str2 ):
@@ -43,9 +49,64 @@ def match_begin(str1, str2):
4349 return True
4450 return False
4551
46- class verify_simple (plain .plain ):
52+ class sub_encode_obfs (object ):
53+ def __init__ (self ):
54+ self .sub_obfs = None
55+
56+ class verify_base (plain .plain ):
4757 def __init__ (self , method ):
58+ super (verify_base , self ).__init__ (method )
4859 self .method = method
60+ self .sub_obfs = None
61+
62+ def init_data (self ):
63+ return sub_encode_obfs ()
64+
65+ def set_server_info (self , server_info ):
66+ try :
67+ if server_info .param :
68+ sub_param = ''
69+ param_list = server_info .param .split (',' , 1 )
70+ if len (param_list ) > 1 :
71+ self .sub_obfs = shadowsocks .obfs .obfs (param_list [0 ])
72+ sub_param = param_list [1 ]
73+ else :
74+ self .sub_obfs = shadowsocks .obfs .obfs (server_info .param )
75+ if server_info .data .sub_obfs is None :
76+ server_info .data .sub_obfs = self .sub_obfs .init_data ()
77+ _server_info = shadowsocks .obfs .server_info (server_info .data .sub_obfs )
78+ _server_info .host = server_info .host
79+ _server_info .port = server_info .port
80+ _server_info .tcp_mss = server_info .tcp_mss
81+ _server_info .param = sub_param
82+ self .sub_obfs .set_server_info (_server_info )
83+ except Exception as e :
84+ shadowsocks .shell .print_exception (e )
85+ self .server_info = server_info
86+
87+ def client_encode (self , buf ):
88+ if self .sub_obfs is not None :
89+ return self .sub_obfs .client_encode (buf )
90+ return buf
91+
92+ def client_decode (self , buf ):
93+ if self .sub_obfs is not None :
94+ return self .sub_obfs .client_decode (buf )
95+ return (buf , False )
96+
97+ def server_encode (self , buf ):
98+ if self .sub_obfs is not None :
99+ return self .sub_obfs .server_encode (buf )
100+ return buf
101+
102+ def server_decode (self , buf ):
103+ if self .sub_obfs is not None :
104+ return self .sub_obfs .server_decode (buf )
105+ return (buf , True , False )
106+
107+ class verify_simple (verify_base ):
108+ def __init__ (self , method ):
109+ super (verify_simple , self ).__init__ (method )
49110 self .recv_buf = b''
50111 self .unit_len = 8100
51112 self .decrypt_packet_num = 0
@@ -69,13 +130,6 @@ def client_pre_encrypt(self, buf):
69130 ret += self .pack_data (buf )
70131 return ret
71132
72- def client_encode (self , buf ):
73- return buf
74-
75- def client_decode (self , buf ):
76- # (buffer_to_recv, is_need_to_encode_and_send_back)
77- return (buf , False )
78-
79133 def client_post_decrypt (self , buf ):
80134 if self .raw_trans :
81135 return buf
@@ -117,13 +171,6 @@ def server_pre_encrypt(self, buf):
117171 ret += self .pack_data (buf )
118172 return ret
119173
120- def server_encode (self , buf ):
121- return buf
122-
123- def server_decode (self , buf ):
124- # (buffer_to_recv, is_need_decrypt, is_need_to_encode_and_send_back)
125- return (buf , True , False )
126-
127174 def server_post_decrypt (self , buf ):
128175 if self .raw_trans :
129176 return buf
@@ -157,3 +204,82 @@ def server_post_decrypt(self, buf):
157204 self .decrypt_packet_num += 1
158205 return out_buf
159206
207+ class verify_deflate (verify_base ):
208+ def __init__ (self , method ):
209+ super (verify_deflate , self ).__init__ (method )
210+ self .recv_buf = b''
211+ self .unit_len = 32700
212+ self .decrypt_packet_num = 0
213+ self .raw_trans = False
214+
215+ def pack_data (self , buf ):
216+ if len (buf ) == 0 :
217+ return b''
218+ data = zlib .compress (buf )
219+ data = struct .pack ('>H' , len (data )) + data [2 :]
220+ return data
221+
222+ def client_pre_encrypt (self , buf ):
223+ ret = b''
224+ while len (buf ) > self .unit_len :
225+ ret += self .pack_data (buf [:self .unit_len ])
226+ buf = buf [self .unit_len :]
227+ ret += self .pack_data (buf )
228+ return ret
229+
230+ def client_post_decrypt (self , buf ):
231+ if self .raw_trans :
232+ return buf
233+ self .recv_buf += buf
234+ out_buf = b''
235+ while len (self .recv_buf ) > 2 :
236+ length = struct .unpack ('>H' , self .recv_buf [:2 ])[0 ]
237+ if length >= 32768 :
238+ self .raw_trans = True
239+ self .recv_buf = b''
240+ if self .decrypt_packet_num == 0 :
241+ return None
242+ else :
243+ raise Exception ('server_post_decrype data error' )
244+ if length > len (self .recv_buf ):
245+ break
246+
247+ out_buf += zlib .decompress (b'x\x9c ' + self .recv_buf [2 :length ])
248+ self .recv_buf = self .recv_buf [length :]
249+
250+ if out_buf :
251+ self .decrypt_packet_num += 1
252+ return out_buf
253+
254+ def server_pre_encrypt (self , buf ):
255+ ret = b''
256+ while len (buf ) > self .unit_len :
257+ ret += self .pack_data (buf [:self .unit_len ])
258+ buf = buf [self .unit_len :]
259+ ret += self .pack_data (buf )
260+ return ret
261+
262+ def server_post_decrypt (self , buf ):
263+ if self .raw_trans :
264+ return buf
265+ self .recv_buf += buf
266+ out_buf = b''
267+ while len (self .recv_buf ) > 2 :
268+ length = struct .unpack ('>H' , self .recv_buf [:2 ])[0 ]
269+ if length >= 32768 :
270+ self .raw_trans = True
271+ self .recv_buf = b''
272+ if self .decrypt_packet_num == 0 :
273+ return None
274+ else :
275+ raise Exception ('server_post_decrype data error' )
276+ if length > len (self .recv_buf ):
277+ break
278+
279+ out_buf += zlib .decompress (b'\x78 \x9c ' + self .recv_buf [2 :length ])
280+ self .recv_buf = self .recv_buf [length :]
281+
282+ if out_buf :
283+ self .decrypt_packet_num += 1
284+ return out_buf
285+
0 commit comments