Add chacha20-ietf crypto (#590)

* Add chacha20-ietf crypto

* fix chacha20-ietf

* PEP8

* Update sodium.py (#1)

pep8
This commit is contained in:
smounives 2016-08-17 17:06:54 +08:00 committed by mengskysama
parent 8e8ee5d490
commit 6ef14e56db
4 changed files with 36 additions and 7 deletions

View file

@ -7,7 +7,7 @@ with codecs.open('README.rst', encoding='utf-8') as f:
setup( setup(
name="shadowsocks", name="shadowsocks",
version="2.8.2", version="2.9.0",
license='http://www.apache.org/licenses/LICENSE-2.0', license='http://www.apache.org/licenses/LICENSE-2.0',
description="A fast tunnel proxy that help you get through firewalls", description="A fast tunnel proxy that help you get through firewalls",
author='clowwindy', author='clowwindy',

View file

@ -17,7 +17,7 @@
from __future__ import absolute_import, division, print_function, \ from __future__ import absolute_import, division, print_function, \
with_statement with_statement
from ctypes import c_char_p, c_int, c_ulonglong, byref, \ from ctypes import c_char_p, c_int, c_ulonglong, byref, c_ulong, \
create_string_buffer, c_void_p create_string_buffer, c_void_p
from shadowsocks.crypto import util from shadowsocks.crypto import util
@ -29,7 +29,7 @@ loaded = False
buf_size = 2048 buf_size = 2048
# for salsa20 and chacha20 # for salsa20 and chacha20 and chacha20-ietf
BLOCK_SIZE = 64 BLOCK_SIZE = 64
@ -51,6 +51,13 @@ def load_libsodium():
c_ulonglong, c_ulonglong,
c_char_p, c_ulonglong, c_char_p, c_ulonglong,
c_char_p) c_char_p)
libsodium.crypto_stream_chacha20_ietf_xor_ic.restype = c_int
libsodium.crypto_stream_chacha20_ietf_xor_ic.argtypes = (c_void_p,
c_char_p,
c_ulonglong,
c_char_p,
c_ulong,
c_char_p)
buf = create_string_buffer(buf_size) buf = create_string_buffer(buf_size)
loaded = True loaded = True
@ -68,6 +75,8 @@ class SodiumCrypto(object):
self.cipher = libsodium.crypto_stream_salsa20_xor_ic self.cipher = libsodium.crypto_stream_salsa20_xor_ic
elif cipher_name == 'chacha20': elif cipher_name == 'chacha20':
self.cipher = libsodium.crypto_stream_chacha20_xor_ic self.cipher = libsodium.crypto_stream_chacha20_xor_ic
elif cipher_name == 'chacha20-ietf':
self.cipher = libsodium.crypto_stream_chacha20_ietf_xor_ic
else: else:
raise Exception('Unknown cipher') raise Exception('Unknown cipher')
# byte counter, not block counter # byte counter, not block counter
@ -97,6 +106,7 @@ class SodiumCrypto(object):
ciphers = { ciphers = {
'salsa20': (32, 8, SodiumCrypto), 'salsa20': (32, 8, SodiumCrypto),
'chacha20': (32, 8, SodiumCrypto), 'chacha20': (32, 8, SodiumCrypto),
'chacha20-ietf': (32, 12, SodiumCrypto),
} }
@ -115,6 +125,15 @@ def test_chacha20():
util.run_cipher(cipher, decipher) util.run_cipher(cipher, decipher)
def test_chacha20_ietf():
cipher = SodiumCrypto('chacha20-ietf', b'k' * 32, b'i' * 16, 1)
decipher = SodiumCrypto('chacha20-ietf', b'k' * 32, b'i' * 16, 0)
util.run_cipher(cipher, decipher)
if __name__ == '__main__': if __name__ == '__main__':
test_chacha20() test_chacha20()
test_salsa20() test_salsa20()
test_chacha20_ietf()

10
tests/chacha20-ietf.json Normal file
View file

@ -0,0 +1,10 @@
{
"server":"127.0.0.1",
"server_port":8388,
"local_port":1081,
"password":"salsa20_password",
"timeout":60,
"method":"chacha20-ietf",
"local_address":"127.0.0.1",
"fast_open":false
}

View file

@ -1,10 +1,10 @@
#!/bin/bash #!/bin/bash
if [ ! -d libsodium-1.0.1 ]; then if [ ! -d libsodium-1.0.11 ]; then
wget https://github.com/jedisct1/libsodium/releases/download/1.0.1/libsodium-1.0.1.tar.gz || exit 1 wget https://github.com/jedisct1/libsodium/releases/download/1.0.11/libsodium-1.0.11.tar.gz || exit 1
tar xf libsodium-1.0.1.tar.gz || exit 1 tar xf libsodium-1.0.11.tar.gz || exit 1
fi fi
pushd libsodium-1.0.1 pushd libsodium-1.0.11
./configure && make -j2 && make install || exit 1 ./configure && make -j2 && make install || exit 1
sudo ldconfig sudo ldconfig
popd popd