Allow disabling aes-cfb feature to stop linking with openssl

This commit is contained in:
zonyitoo
2019-04-30 09:01:30 +08:00
parent 2ba6d8c22d
commit 3de0158e18
6 changed files with 87 additions and 14 deletions
+4 -3
View File
@@ -32,9 +32,10 @@ path = "src/bin/ssdns.rs"
lto = true
[features]
default = ["sodium", "rc4"]
default = ["sodium", "rc4", "aes-cfb"]
sodium = ["libsodium-ffi"]
rc4 = []
rc4 = ["openssl"]
aes-cfb = ["openssl"]
single-threaded = []
[dependencies]
@@ -44,7 +45,7 @@ rand = "0.6"
time = "0.1"
clap = "2"
env_logger = "0.6"
openssl = "0.10"
openssl = { version = "0.10", optional = true }
libc = "0.2"
futures = "0.1"
tokio-io = "0.1"
+6 -2
View File
@@ -13,7 +13,7 @@ shadowsocks is a fast tunnel proxy that helps you bypass firewalls.
## Dependencies
* libcrypto (OpenSSL)
* libcrypto (OpenSSL) (Required for `aes-cfb-*` and `rc4` ciphers)
* libsodium >= 1.0.7 (Required for ciphers that are provided by libsodium)
## Build & Install
@@ -24,9 +24,13 @@ shadowsocks is a fast tunnel proxy that helps you bypass firewalls.
* `rc4` - Enabled `rc4` encryption algorithm. Some OpenSSL Crypto does not ship with `rc4`, because it was already deprecated in 2015.
* `aes-cfb` - Enabled `aes-cfb-*` encryption algorithm.
* `single-threaded` - Let `sslocal` and `ssserver` run in single threaded mode (by using `tokio::current_thread::Runtime`).
Default features: `["sodium", "rc4"]`.
Default features: `["sodium", "rc4", "aes-cfb"]`.
NOTE: To disable dependency of OpenSSL, just disable feature `"rc4"` and `"aes-cfb"`.
### **crates.io**
+51 -2
View File
@@ -3,13 +3,13 @@
use std::{
convert::From,
fmt::{self, Debug, Display},
io,
mem,
io, mem,
str::{self, FromStr},
};
use crate::crypto::digest::{self, Digest, DigestType};
use bytes::{BufMut, Bytes, BytesMut};
#[cfg(feature = "openssl")]
use openssl::symm;
use rand::{self, RngCore};
use ring::aead::{AES_128_GCM, AES_256_GCM, CHACHA20_POLY1305};
@@ -20,6 +20,7 @@ pub type CipherResult<T> = Result<T, Error>;
/// Cipher error
pub enum Error {
UnknownCipherType,
#[cfg(feature = "openssl")]
OpenSSLError(::openssl::error::ErrorStack),
IoError(io::Error),
AeadDecryptFailed,
@@ -30,6 +31,7 @@ impl Debug for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Error::UnknownCipherType => write!(f, "UnknownCipherType"),
#[cfg(feature = "openssl")]
Error::OpenSSLError(ref err) => write!(f, "{:?}", err),
Error::IoError(ref err) => write!(f, "{:?}", err),
Error::AeadDecryptFailed => write!(f, "AEAD decrypt failed"),
@@ -42,6 +44,7 @@ impl Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Error::UnknownCipherType => write!(f, "UnknownCipherType"),
#[cfg(feature = "openssl")]
Error::OpenSSLError(ref err) => write!(f, "{}", err),
Error::IoError(ref err) => write!(f, "{}", err),
Error::AeadDecryptFailed => write!(f, "AeadDecryptFailed"),
@@ -54,6 +57,7 @@ impl From<Error> for io::Error {
fn from(e: Error) -> io::Error {
match e {
Error::UnknownCipherType => io::Error::new(io::ErrorKind::Other, "Unknown Cipher type"),
#[cfg(feature = "openssl")]
Error::OpenSSLError(err) => From::from(err),
Error::IoError(err) => err,
Error::AeadDecryptFailed => io::Error::new(io::ErrorKind::Other, "AEAD decrypt error"),
@@ -62,20 +66,29 @@ impl From<Error> for io::Error {
}
}
#[cfg(feature = "openssl")]
impl From<::openssl::error::ErrorStack> for Error {
fn from(e: ::openssl::error::ErrorStack) -> Error {
Error::OpenSSLError(e)
}
}
#[cfg(feature = "aes-cfb")]
const CIPHER_AES_128_CFB: &str = "aes-128-cfb";
#[cfg(feature = "aes-cfb")]
const CIPHER_AES_128_CFB_1: &str = "aes-128-cfb1";
#[cfg(feature = "aes-cfb")]
const CIPHER_AES_128_CFB_8: &str = "aes-128-cfb8";
#[cfg(feature = "aes-cfb")]
const CIPHER_AES_128_CFB_128: &str = "aes-128-cfb128";
#[cfg(feature = "aes-cfb")]
const CIPHER_AES_256_CFB: &str = "aes-256-cfb";
#[cfg(feature = "aes-cfb")]
const CIPHER_AES_256_CFB_1: &str = "aes-256-cfb1";
#[cfg(feature = "aes-cfb")]
const CIPHER_AES_256_CFB_8: &str = "aes-256-cfb8";
#[cfg(feature = "aes-cfb")]
const CIPHER_AES_256_CFB_128: &str = "aes-256-cfb128";
#[cfg(feature = "rc4")]
@@ -113,14 +126,22 @@ pub enum CipherType {
Table,
Plain,
#[cfg(feature = "aes-cfb")]
Aes128Cfb,
#[cfg(feature = "aes-cfb")]
Aes128Cfb1,
#[cfg(feature = "aes-cfb")]
Aes128Cfb8,
#[cfg(feature = "aes-cfb")]
Aes128Cfb128,
#[cfg(feature = "aes-cfb")]
Aes256Cfb,
#[cfg(feature = "aes-cfb")]
Aes256Cfb1,
#[cfg(feature = "aes-cfb")]
Aes256Cfb8,
#[cfg(feature = "aes-cfb")]
Aes256Cfb128,
#[cfg(feature = "rc4")]
@@ -165,11 +186,17 @@ impl CipherType {
match self {
CipherType::Table | CipherType::Plain => 0,
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb1 => symm::Cipher::aes_128_cfb1().key_len(),
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb8 => symm::Cipher::aes_128_cfb8().key_len(),
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb | CipherType::Aes128Cfb128 => symm::Cipher::aes_128_cfb128().key_len(),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb1 => symm::Cipher::aes_256_cfb1().key_len(),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb8 => symm::Cipher::aes_256_cfb8().key_len(),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb | CipherType::Aes256Cfb128 => symm::Cipher::aes_256_cfb128().key_len(),
#[cfg(feature = "rc4")]
@@ -234,21 +261,27 @@ impl CipherType {
match self {
CipherType::Table | CipherType::Plain => 0,
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb1 => symm::Cipher::aes_128_cfb1()
.iv_len()
.expect("iv_len should not be None"),
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb8 => symm::Cipher::aes_128_cfb8()
.iv_len()
.expect("iv_len should not be None"),
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb | CipherType::Aes128Cfb128 => symm::Cipher::aes_128_cfb128()
.iv_len()
.expect("iv_len should not be None"),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb1 => symm::Cipher::aes_256_cfb1()
.iv_len()
.expect("iv_len should not be None"),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb8 => symm::Cipher::aes_256_cfb8()
.iv_len()
.expect("iv_len should not be None"),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb | CipherType::Aes256Cfb128 => symm::Cipher::aes_256_cfb128()
.iv_len()
.expect("iv_len should not be None"),
@@ -347,14 +380,22 @@ impl FromStr for CipherType {
match s {
CIPHER_TABLE | "" => Ok(CipherType::Table),
CIPHER_PLAIN => Ok(CipherType::Plain),
#[cfg(feature = "aes-cfb")]
CIPHER_AES_128_CFB => Ok(CipherType::Aes128Cfb),
#[cfg(feature = "aes-cfb")]
CIPHER_AES_128_CFB_1 => Ok(CipherType::Aes128Cfb1),
#[cfg(feature = "aes-cfb")]
CIPHER_AES_128_CFB_8 => Ok(CipherType::Aes128Cfb8),
#[cfg(feature = "aes-cfb")]
CIPHER_AES_128_CFB_128 => Ok(CipherType::Aes128Cfb128),
#[cfg(feature = "aes-cfb")]
CIPHER_AES_256_CFB => Ok(CipherType::Aes256Cfb),
#[cfg(feature = "aes-cfb")]
CIPHER_AES_256_CFB_1 => Ok(CipherType::Aes256Cfb1),
#[cfg(feature = "aes-cfb")]
CIPHER_AES_256_CFB_8 => Ok(CipherType::Aes256Cfb8),
#[cfg(feature = "aes-cfb")]
CIPHER_AES_256_CFB_128 => Ok(CipherType::Aes256Cfb128),
#[cfg(feature = "rc4")]
@@ -393,14 +434,22 @@ impl Display for CipherType {
match *self {
CipherType::Table => write!(f, "{}", CIPHER_TABLE),
CipherType::Plain => write!(f, "{}", CIPHER_PLAIN),
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb => write!(f, "{}", CIPHER_AES_128_CFB),
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb1 => write!(f, "{}", CIPHER_AES_128_CFB_1),
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb8 => write!(f, "{}", CIPHER_AES_128_CFB_8),
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb128 => write!(f, "{}", CIPHER_AES_128_CFB_128),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb => write!(f, "{}", CIPHER_AES_256_CFB),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb1 => write!(f, "{}", CIPHER_AES_256_CFB_1),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb8 => write!(f, "{}", CIPHER_AES_256_CFB_8),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb128 => write!(f, "{}", CIPHER_AES_256_CFB_128),
#[cfg(feature = "rc4")]
+4 -2
View File
@@ -5,13 +5,14 @@ pub use self::{
cipher::{CipherCategory, CipherResult, CipherType},
stream::{new_stream, BoxStreamCipher, StreamCipher},
};
#[cfg(feature = "openssl")]
use ::openssl::symm;
use std::convert::From;
pub mod aead;
pub mod cipher;
pub mod digest;
pub mod dummy;
#[cfg(feature = "openssl")]
pub mod openssl;
#[cfg(feature = "rc4")]
pub mod rc4_md5;
@@ -30,7 +31,8 @@ pub enum CryptoMode {
Decrypt,
}
impl From<CryptoMode> for symm::Mode {
#[cfg(feature = "openssl")]
impl std::convert::From<CryptoMode> for symm::Mode {
fn from(m: CryptoMode) -> symm::Mode {
match m {
CryptoMode::Encrypt => symm::Mode::Encrypt,
+6
View File
@@ -19,11 +19,17 @@ impl OpenSSLCrypto {
/// Creates by type
pub fn new(cipher_type: cipher::CipherType, key: &[u8], iv: &[u8], mode: CryptoMode) -> OpenSSLCrypto {
let t = match cipher_type {
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb => symm::Cipher::aes_128_cfb128(),
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb1 => symm::Cipher::aes_128_cfb1(),
#[cfg(feature = "aes-cfb")]
CipherType::Aes128Cfb128 => symm::Cipher::aes_128_cfb128(),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb => symm::Cipher::aes_256_cfb128(),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb1 => symm::Cipher::aes_256_cfb1(),
#[cfg(feature = "aes-cfb")]
CipherType::Aes256Cfb128 => symm::Cipher::aes_256_cfb128(),
#[cfg(feature = "rc4")]
+16 -5
View File
@@ -2,16 +2,15 @@
use std::ops::{Deref, DerefMut};
#[cfg(feature = "openssl")]
use crate::crypto::openssl;
#[cfg(feature = "rc4")]
use crate::crypto::rc4_md5;
#[cfg(feature = "sodium")]
use crate::crypto::sodium;
use crate::crypto::{
cipher::{CipherCategory, CipherResult, CipherType},
dummy,
openssl,
table,
CryptoMode,
dummy, table, CryptoMode,
};
use bytes::BufMut;
@@ -109,12 +108,14 @@ define_stream_ciphers! {
pub DummyCipher => dummy::DummyCipher,
#[cfg(feature = "rc4")]
pub Rc4Md5Cipher => rc4_md5::Rc4Md5Cipher,
#[cfg(feature = "openssl")]
pub OpenSSLCipher => openssl::OpenSSLCipher,
#[cfg(feature = "sodium")]
pub SodiumStreamCipher => sodium::SodiumStreamCipher,
}
/// Generate a specific Cipher with key and initialize vector
#[allow(unused_variables)]
pub fn new_stream(t: CipherType, key: &[u8], iv: &[u8], mode: CryptoMode) -> BoxStreamCipher {
assert!(
t.category() == CipherCategory::Stream,
@@ -133,7 +134,17 @@ pub fn new_stream(t: CipherType, key: &[u8], iv: &[u8], mode: CryptoMode) -> Box
#[cfg(feature = "rc4")]
CipherType::Rc4Md5 => StreamCipherVariant::new(rc4_md5::Rc4Md5Cipher::new(key, iv, mode)),
_ => StreamCipherVariant::new(openssl::OpenSSLCipher::new(t, key, iv, mode)),
#[cfg(feature = "openssl")]
CipherType::Aes128Cfb
| CipherType::Aes128Cfb1
| CipherType::Aes128Cfb8
| CipherType::Aes128Cfb128
| CipherType::Aes256Cfb
| CipherType::Aes256Cfb1
| CipherType::Aes256Cfb8
| CipherType::Aes256Cfb128 => StreamCipherVariant::new(openssl::OpenSSLCipher::new(t, key, iv, mode)),
_ => unreachable!("{} is not a stream cipher", t),
};
BoxStreamCipher {
cipher: Box::new(cipher),