From 041a5c1046e08c9f2b9b6b5a75e04d63be29ac64 Mon Sep 17 00:00:00 2001 From: BreakWa11 Date: Wed, 21 Oct 2015 22:02:22 +0800 Subject: [PATCH] optimize decrypt first recv size < iv_len will cause decrypt error --- db_transfer.py | 3 ++- server_pool.py | 4 ++-- shadowsocks/encrypt.py | 21 +++++++++++++-------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/db_transfer.py b/db_transfer.py index e96819a..ba6e3ea 100644 --- a/db_transfer.py +++ b/db_transfer.py @@ -8,6 +8,7 @@ import sys from server_pool import ServerPool import Config import traceback +from shadowsocks import common class DbTransfer(object): @@ -115,7 +116,7 @@ class DbTransfer(object): allow = False port = row['port'] - passwd = row['passwd'] + passwd = common.to_bytes(row['passwd']) if port not in cur_servers: cur_servers[port] = passwd diff --git a/server_pool.py b/server_pool.py index 77d300d..4b4663c 100644 --- a/server_pool.py +++ b/server_pool.py @@ -187,9 +187,9 @@ class ServerPool(object): if 'server_ipv6' in self.config: if port not in self.tcp_ipv6_servers_pool: - logging.info("stopped server at %s:%d already stop" % (self.config['server_ipv6'], port)) + logging.info("stopped server at [%s]:%d already stop" % (self.config['server_ipv6'], port)) else: - logging.info("stopped server at %s:%d" % (self.config['server_ipv6'], port)) + logging.info("stopped server at [%s]:%d" % (self.config['server_ipv6'], port)) try: self.tcp_ipv6_servers_pool[port].close(False) del self.tcp_ipv6_servers_pool[port] diff --git a/shadowsocks/encrypt.py b/shadowsocks/encrypt.py index 834b18c..b7981b4 100644 --- a/shadowsocks/encrypt.py +++ b/shadowsocks/encrypt.py @@ -77,6 +77,7 @@ class Encryptor(object): self.iv = None self.iv_sent = False self.cipher_iv = b'' + self.iv_buf = b'' self.decipher = None method = method.lower() self._method_info = self.get_method_info(method) @@ -122,16 +123,20 @@ class Encryptor(object): def decrypt(self, buf): if len(buf) == 0: return buf - if self.decipher is None: - decipher_iv_len = self._method_info[1] - decipher_iv = buf[:decipher_iv_len] + if self.decipher is not None: #optimize + return self.decipher.update(buf) + + decipher_iv_len = self._method_info[1] + if len(self.iv_buf) <= decipher_iv_len: + self.iv_buf += buf + if len(self.iv_buf) > decipher_iv_len: + decipher_iv = self.iv_buf[:decipher_iv_len] self.decipher = self.get_cipher(self.key, self.method, 0, iv=decipher_iv) - buf = buf[decipher_iv_len:] - if len(buf) == 0: - return buf - return self.decipher.update(buf) - + buf = self.iv_buf[decipher_iv_len:] + return self.decipher.update(buf) + else: + return b'' def encrypt_all(password, method, op, data): result = []