optimize decrypt
first recv size < iv_len will cause decrypt error
This commit is contained in:
parent
79260ff4ab
commit
041a5c1046
3 changed files with 17 additions and 11 deletions
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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 = []
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue