Browse Source

support CTR mode

auth
clowwindy 10 years ago
parent
commit
0e649453ed
  1. 17
      shadowsocks/crypto/ctypes_openssl.py

17
shadowsocks/crypto/ctypes_openssl.py

@ -54,12 +54,24 @@ def load_openssl():
loaded = True loaded = True
def load_ctr_cipher(cipher_name):
func_name = 'EVP_' + cipher_name.replace('-', '_')
cipher = getattr(libcrypto, func_name, None)
if cipher:
cipher.restype = c_void_p
return cipher()
return None
class CtypesCrypto(object): class CtypesCrypto(object):
def __init__(self, cipher_name, key, iv, op): def __init__(self, cipher_name, key, iv, op):
if not loaded: if not loaded:
load_openssl() load_openssl()
self._ctx = None self._ctx = None
cipher = libcrypto.EVP_get_cipherbyname(cipher_name) if 'ctr' in cipher_name:
cipher = load_ctr_cipher(cipher_name)
else:
cipher = libcrypto.EVP_get_cipherbyname(cipher_name)
if not cipher: if not cipher:
raise Exception('cipher %s not found in libcrypto' % cipher_name) raise Exception('cipher %s not found in libcrypto' % cipher_name)
key_ptr = c_char_p(key) key_ptr = c_char_p(key)
@ -91,6 +103,9 @@ class CtypesCrypto(object):
ciphers = { ciphers = {
'aes-128-ctr': (16, 16, CtypesCrypto),
'aes-192-ctr': (24, 16, CtypesCrypto),
'aes-256-ctr': (32, 16, CtypesCrypto),
'aes-128-cfb8': (16, 16, CtypesCrypto), 'aes-128-cfb8': (16, 16, CtypesCrypto),
'aes-192-cfb8': (24, 16, CtypesCrypto), 'aes-192-cfb8': (24, 16, CtypesCrypto),
'aes-256-cfb8': (32, 16, CtypesCrypto), 'aes-256-cfb8': (32, 16, CtypesCrypto),

Loading…
Cancel
Save