mirror of
https://github.com/shadowsocks/shadowsocks-rust.git
synced 2026-02-09 01:59:16 +08:00
impls bytes_to_key
This commit is contained in:
48
Cargo.lock
generated
48
Cargo.lock
generated
@@ -2,6 +2,7 @@
|
||||
name = "shadowsocks-rust"
|
||||
version = "1.2.0"
|
||||
dependencies = [
|
||||
"argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"base64 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.20.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -20,7 +21,6 @@ dependencies = [
|
||||
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"sodiumoxide 0.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tokio-core 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
@@ -43,6 +43,15 @@ name = "ansi_term"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "argon2rs"
|
||||
version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"blake2-rfc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"scoped_threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.3.0"
|
||||
@@ -56,6 +65,14 @@ name = "bitflags"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "blake2-rfc"
|
||||
version = "0.2.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"constant_time_eq 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.0.0"
|
||||
@@ -86,6 +103,11 @@ name = "color_quant"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "constant_time_eq"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam"
|
||||
version = "0.2.10"
|
||||
@@ -246,15 +268,6 @@ name = "libc"
|
||||
version = "0.2.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "libsodium-sys"
|
||||
version = "0.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "linked-hash-map"
|
||||
version = "0.2.1"
|
||||
@@ -509,16 +522,6 @@ name = "slab"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "sodiumoxide"
|
||||
version = "0.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libsodium-sys 0.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.6.0"
|
||||
@@ -645,12 +648,15 @@ dependencies = [
|
||||
"checksum adler32 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57be033eb4100070a93a9400a725839cda9c415244f808b0357e72b9e003d5ba"
|
||||
"checksum aho-corasick 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0638fd549427caa90c499814196d1b9e3725eb4d15d7339d6de073a680ed0ca2"
|
||||
"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"
|
||||
"checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392"
|
||||
"checksum base64 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d156a04ec694d726e92ea3c13e4a62949b4f0488a9344f04341d679ec6b127b"
|
||||
"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
|
||||
"checksum blake2-rfc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "0c6a476f32fef3402f1161f89d0d39822809627754a126f8441ff2a9d45e2d59"
|
||||
"checksum byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c40977b0ee6b9885c9013cd41d9feffdd22deb3bb4dc3a71d901cc7a77de18c8"
|
||||
"checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c"
|
||||
"checksum clap 2.20.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f89819450aa94325998aa83ce7ea142db11ad24c725d6bc48459845e0d6d9f18"
|
||||
"checksum color_quant 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a475fc4af42d83d28adf72968d9bcfaf035a1a9381642d8e85d8a04957767b0d"
|
||||
"checksum constant_time_eq 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "07dcb7959f0f6f1cf662f9a7ff389bcb919924d99ac41cf31f10d611d8721323"
|
||||
"checksum crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0c5ea215664ca264da8a9d9c3be80d2eaf30923c259d03e870388eb927508f97"
|
||||
"checksum deflate 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "24c5f3de3a8e183ab9a169654b652407e5e80bed40986bcca92c2b088b9bfa80"
|
||||
"checksum deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1614659040e711785ed8ea24219140654da1729f3ec8a47a9719d041112fe7bf"
|
||||
@@ -673,7 +679,6 @@ dependencies = [
|
||||
"checksum lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6abe0ee2e758cd6bc8a2cd56726359007748fbf4128da998b65d0b70f881e19b"
|
||||
"checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b"
|
||||
"checksum libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)" = "684f330624d8c3784fb9558ca46c4ce488073a8d22450415c5eb4f4cfb0d11b5"
|
||||
"checksum libsodium-sys 0.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cbbc6e46017815abf8698de0ed4847fad45fd8cad2909ac38ac6de79673c1ad1"
|
||||
"checksum linked-hash-map 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bda158e0dabeb97ee8a401f4d17e479d6b891a14de0bba79d5cc2d4d325b5e48"
|
||||
"checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054"
|
||||
"checksum lru-cache 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "656fa4dfcb02bcf1063c592ba3ff6a5303ee1f2afe98c8a889e8b1a77c6dfdb7"
|
||||
@@ -705,7 +710,6 @@ dependencies = [
|
||||
"checksum serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1e0ed773960f90a78567fcfbe935284adf50c5d7cf119aa2cf43bb0b4afa69bb"
|
||||
"checksum serde_json 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e095e4e94e7382b76f48e93bd845ffddda62df8dfd4c163b1bfa93d40e22e13a"
|
||||
"checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23"
|
||||
"checksum sodiumoxide 0.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "bc02c0bc77ffed8e8eaef004399b825cf4fd8aa02d0af6e473225affd583ff4d"
|
||||
"checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"
|
||||
"checksum term_size 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "71662702fe5cd2cf95edd4ad655eea42f24a87a0e44059cbaa4e55260b7bc331"
|
||||
"checksum thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4437c97558c70d129e40629a5b385b3fb1ffac301e63941335e4d354081ec14a"
|
||||
|
||||
@@ -45,4 +45,4 @@ num_cpus = "1.1"
|
||||
lazy_static = "0.2"
|
||||
serde_json = "0.9"
|
||||
base64 = "0.3"
|
||||
sodiumoxide = "0.0"
|
||||
argon2rs = "0.2"
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
//! Ciphers
|
||||
|
||||
use std::str::FromStr;
|
||||
use std::str::{self, FromStr};
|
||||
use std::fmt::{self, Debug, Display};
|
||||
use std::io;
|
||||
use rand::{self, Rng};
|
||||
@@ -31,7 +31,7 @@ use crypto::digest::{self, DigestType, Digest};
|
||||
|
||||
use openssl::symm;
|
||||
|
||||
use sodiumoxide::crypto::pwhash::pwhash;
|
||||
use argon2rs::{Argon2, Variant};
|
||||
|
||||
/// Cipher result
|
||||
pub type CipherResult<T> = Result<T, Error>;
|
||||
@@ -174,39 +174,48 @@ impl CipherType {
|
||||
// Ref: crypto_pwhash (key, nkey, (char*)pass, strlen(pass), salt,
|
||||
// crypto_pwhash_OPSLIMIT_INTERACTIVE, crypto_pwhash_MEMLIMIT_INTERACTIVE,
|
||||
// crypto_pwhash_ALG_DEFAULT);
|
||||
// FIXME: sodiumoxide doesn't support crypto_pwhash (Argon2 algorithm)
|
||||
unimplemented!()
|
||||
|
||||
const SALT: &'static [u8] = b"shadowsocks hash";
|
||||
|
||||
let key_len = self.key_size();
|
||||
let mut buf = vec![0u8; key_len];
|
||||
let a2 = Argon2::default(Variant::Argon2i); // NOTE, libsodium uses 2i as crypto_pwhash_ALG_DEFAULT
|
||||
a2.hash(&mut buf, key, SALT, &[], &[]);
|
||||
buf
|
||||
}
|
||||
|
||||
/// Extends key to match the required key length
|
||||
pub fn bytes_to_key(&self, key: &[u8]) -> Vec<u8> {
|
||||
let iv_len = self.iv_size();
|
||||
let key_len = self.key_size();
|
||||
match self.category() {
|
||||
CipherCategory::Aead => self.aead_key_derive(key),
|
||||
CipherCategory::Stream => {
|
||||
let iv_len = self.iv_size();
|
||||
let key_len = self.key_size();
|
||||
|
||||
// TODO: if self.category() == CipherCategory::Aead, calls `aead_key_derive`.
|
||||
let mut digest = digest::with_type(DigestType::Md5);
|
||||
|
||||
let mut digest = digest::with_type(DigestType::Md5);
|
||||
let mut result = Vec::new();
|
||||
let mut m = Vec::new();
|
||||
let mut loop_count = 0;
|
||||
while loop_count * digest.digest_len() < (key_len + iv_len) {
|
||||
let mut vkey = m.clone();
|
||||
vkey.extend_from_slice(key);
|
||||
|
||||
let mut result = Vec::new();
|
||||
let mut m = Vec::new();
|
||||
let mut loop_count = 0;
|
||||
while loop_count * digest.digest_len() < (key_len + iv_len) {
|
||||
let mut vkey = m.clone();
|
||||
vkey.extend_from_slice(key);
|
||||
digest.update(&vkey);
|
||||
|
||||
digest.update(&vkey);
|
||||
m.clear();
|
||||
digest.digest(&mut m);
|
||||
loop_count += 1;
|
||||
|
||||
m.clear();
|
||||
digest.digest(&mut m);
|
||||
loop_count += 1;
|
||||
digest.reset();
|
||||
|
||||
digest.reset();
|
||||
result.extend_from_slice(&m[..]);
|
||||
}
|
||||
|
||||
result.extend_from_slice(&m[..]);
|
||||
result.resize(key_len, 0);
|
||||
result
|
||||
}
|
||||
}
|
||||
|
||||
result.resize(key_len, 0);
|
||||
result
|
||||
}
|
||||
|
||||
/// Symmetric crypto initialize vector size
|
||||
|
||||
@@ -102,7 +102,7 @@ extern crate rand;
|
||||
extern crate crypto as rust_crypto;
|
||||
extern crate ip;
|
||||
extern crate openssl;
|
||||
extern crate sodiumoxide;
|
||||
extern crate argon2rs;
|
||||
|
||||
extern crate futures;
|
||||
extern crate futures_cpupool;
|
||||
|
||||
Reference in New Issue
Block a user