use native string type for option values

those are comprehended as strings
This commit is contained in:
lilydjwg 2014-11-06 17:29:48 +08:00
parent ea535c74b2
commit 6e84b308bd
6 changed files with 54 additions and 80 deletions

View file

@ -66,9 +66,7 @@ def load_openssl():
def load_cipher(cipher_name): def load_cipher(cipher_name):
func_name = b'EVP_' + cipher_name.replace(b'-', b'_') func_name = 'EVP_' + cipher_name.replace('-', '_')
if bytes != str:
func_name = str(func_name, 'utf-8')
cipher = getattr(libcrypto, func_name, None) cipher = getattr(libcrypto, func_name, None)
if cipher: if cipher:
cipher.restype = c_void_p cipher.restype = c_void_p
@ -119,31 +117,31 @@ class CtypesCrypto(object):
ciphers = { ciphers = {
b'aes-128-cfb': (16, 16, CtypesCrypto), 'aes-128-cfb': (16, 16, CtypesCrypto),
b'aes-192-cfb': (24, 16, CtypesCrypto), 'aes-192-cfb': (24, 16, CtypesCrypto),
b'aes-256-cfb': (32, 16, CtypesCrypto), 'aes-256-cfb': (32, 16, CtypesCrypto),
b'aes-128-ofb': (16, 16, CtypesCrypto), 'aes-128-ofb': (16, 16, CtypesCrypto),
b'aes-192-ofb': (24, 16, CtypesCrypto), 'aes-192-ofb': (24, 16, CtypesCrypto),
b'aes-256-ofb': (32, 16, CtypesCrypto), 'aes-256-ofb': (32, 16, CtypesCrypto),
b'aes-128-ctr': (16, 16, CtypesCrypto), 'aes-128-ctr': (16, 16, CtypesCrypto),
b'aes-192-ctr': (24, 16, CtypesCrypto), 'aes-192-ctr': (24, 16, CtypesCrypto),
b'aes-256-ctr': (32, 16, CtypesCrypto), 'aes-256-ctr': (32, 16, CtypesCrypto),
b'aes-128-cfb8': (16, 16, CtypesCrypto), 'aes-128-cfb8': (16, 16, CtypesCrypto),
b'aes-192-cfb8': (24, 16, CtypesCrypto), 'aes-192-cfb8': (24, 16, CtypesCrypto),
b'aes-256-cfb8': (32, 16, CtypesCrypto), 'aes-256-cfb8': (32, 16, CtypesCrypto),
b'aes-128-cfb1': (16, 16, CtypesCrypto), 'aes-128-cfb1': (16, 16, CtypesCrypto),
b'aes-192-cfb1': (24, 16, CtypesCrypto), 'aes-192-cfb1': (24, 16, CtypesCrypto),
b'aes-256-cfb1': (32, 16, CtypesCrypto), 'aes-256-cfb1': (32, 16, CtypesCrypto),
b'bf-cfb': (16, 8, CtypesCrypto), 'bf-cfb': (16, 8, CtypesCrypto),
b'camellia-128-cfb': (16, 16, CtypesCrypto), 'camellia-128-cfb': (16, 16, CtypesCrypto),
b'camellia-192-cfb': (24, 16, CtypesCrypto), 'camellia-192-cfb': (24, 16, CtypesCrypto),
b'camellia-256-cfb': (32, 16, CtypesCrypto), 'camellia-256-cfb': (32, 16, CtypesCrypto),
b'cast5-cfb': (16, 8, CtypesCrypto), 'cast5-cfb': (16, 8, CtypesCrypto),
b'des-cfb': (8, 8, CtypesCrypto), 'des-cfb': (8, 8, CtypesCrypto),
b'idea-cfb': (16, 8, CtypesCrypto), 'idea-cfb': (16, 8, CtypesCrypto),
b'rc2-cfb': (16, 8, CtypesCrypto), 'rc2-cfb': (16, 8, CtypesCrypto),
b'rc4': (16, 0, CtypesCrypto), 'rc4': (16, 0, CtypesCrypto),
b'seed-cfb': (16, 16, CtypesCrypto), 'seed-cfb': (16, 16, CtypesCrypto),
} }

View file

@ -52,19 +52,19 @@ def err(alg, key, iv, op, key_as_bytes=0, d=None, salt=None, i=1, padding=1):
if has_m2: if has_m2:
ciphers = { ciphers = {
b'aes-128-cfb': (16, 16, create_cipher), 'aes-128-cfb': (16, 16, create_cipher),
b'aes-192-cfb': (24, 16, create_cipher), 'aes-192-cfb': (24, 16, create_cipher),
b'aes-256-cfb': (32, 16, create_cipher), 'aes-256-cfb': (32, 16, create_cipher),
b'bf-cfb': (16, 8, create_cipher), 'bf-cfb': (16, 8, create_cipher),
b'camellia-128-cfb': (16, 16, create_cipher), 'camellia-128-cfb': (16, 16, create_cipher),
b'camellia-192-cfb': (24, 16, create_cipher), 'camellia-192-cfb': (24, 16, create_cipher),
b'camellia-256-cfb': (32, 16, create_cipher), 'camellia-256-cfb': (32, 16, create_cipher),
b'cast5-cfb': (16, 8, create_cipher), 'cast5-cfb': (16, 8, create_cipher),
b'des-cfb': (8, 8, create_cipher), 'des-cfb': (8, 8, create_cipher),
b'idea-cfb': (16, 8, create_cipher), 'idea-cfb': (16, 8, create_cipher),
b'rc2-cfb': (16, 8, create_cipher), 'rc2-cfb': (16, 8, create_cipher),
b'rc4': (16, 0, create_cipher), 'rc4': (16, 0, create_cipher),
b'seed-cfb': (16, 16, create_cipher), 'seed-cfb': (16, 16, create_cipher),
} }
else: else:
ciphers = {} ciphers = {}

View file

@ -47,7 +47,7 @@ def create_cipher(alg, key, iv, op, key_as_bytes=0, d=None, salt=None,
ciphers = { ciphers = {
b'rc4-md5': (16, 16, create_cipher), 'rc4-md5': (16, 16, create_cipher),
} }

View file

@ -123,7 +123,7 @@ class Salsa20Cipher(object):
ciphers = { ciphers = {
b'salsa20-ctr': (32, 8, Salsa20Cipher), 'salsa20-ctr': (32, 8, Salsa20Cipher),
} }

View file

@ -73,7 +73,7 @@ class TableCipher(object):
ciphers = { ciphers = {
b'table': (0, 0, TableCipher) 'table': (0, 0, TableCipher)
} }

View file

@ -21,19 +21,22 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE. # SOFTWARE.
from __future__ import absolute_import, division, print_function, \ from __future__ import (
with_statement absolute_import, division, print_function, with_statement,
)
import os import os
import json import json
import sys import sys
import getopt import getopt
import logging import logging
from shadowsocks.common import to_bytes
VERBOSE_LEVEL = 5 VERBOSE_LEVEL = 5
if sys.version_info[0] == 2:
import codecs
open = codecs.open
def check_python(): def check_python():
info = sys.version_info info = sys.version_info
@ -110,10 +113,9 @@ def get_config(is_local):
if config_path: if config_path:
logging.info('loading config from %s' % config_path) logging.info('loading config from %s' % config_path)
with open(config_path, 'rb') as f: with open(config_path, 'r', encoding='utf-8') as f:
try: try:
config = json.loads(f.read().decode('utf8'), config = json.load(f)
object_hook=_decode_dict)
except ValueError as e: except ValueError as e:
logging.error('found an error in config.json: %s', logging.error('found an error in config.json: %s',
e.message) e.message)
@ -127,15 +129,15 @@ def get_config(is_local):
if key == '-p': if key == '-p':
config['server_port'] = int(value) config['server_port'] = int(value)
elif key == '-k': elif key == '-k':
config['password'] = to_bytes(value) config['password'] = value
elif key == '-l': elif key == '-l':
config['local_port'] = int(value) config['local_port'] = int(value)
elif key == '-s': elif key == '-s':
config['server'] = to_bytes(value) config['server'] = value
elif key == '-m': elif key == '-m':
config['method'] = to_bytes(value) config['method'] = value
elif key == '-b': elif key == '-b':
config['local_address'] = to_bytes(value) config['local_address'] = value
elif key == '-v': elif key == '-v':
v_count += 1 v_count += 1
# '-vv' turns on more verbose mode # '-vv' turns on more verbose mode
@ -271,29 +273,3 @@ optional arguments:
Online help: <https://github.com/clowwindy/shadowsocks> Online help: <https://github.com/clowwindy/shadowsocks>
''') ''')
def _decode_list(data):
rv = []
for item in data:
if hasattr(item, 'encode'):
item = item.encode('utf-8')
elif isinstance(item, list):
item = _decode_list(item)
elif isinstance(item, dict):
item = _decode_dict(item)
rv.append(item)
return rv
def _decode_dict(data):
rv = {}
for key, value in data.items():
if hasattr(value, 'encode'):
value = value.encode('utf-8')
elif isinstance(value, list):
value = _decode_list(value)
elif isinstance(value, dict):
value = _decode_dict(value)
rv[key] = value
return rv