construct cipher inside stream wrapper

This commit is contained in:
Y. T. Chung
2017-02-18 16:49:36 +08:00
parent 10baee58a5
commit ae787715d5
2 changed files with 9 additions and 20 deletions

View File

@@ -27,8 +27,7 @@ use std::rc::Rc;
use std::mem;
use std::time::Duration;
use crypto;
use crypto::{CryptoMode, CipherCategory};
use crypto::CipherCategory;
use relay::socks5::Address;
use relay::{BoxIoFuture, boxed_future};
use relay::dns_resolver::DnsResolver;
@@ -248,12 +247,7 @@ pub fn proxy_handshake(remote_stream: TcpStream,
match svr_cfg.method().category() {
CipherCategory::Stream => {
let local_iv = prev_buf;
let encryptor = crypto::new_stream(svr_cfg.method(),
svr_cfg.key(),
&local_iv[..],
CryptoMode::Encrypt);
Ok(From::from(StreamEncryptedWriter::new(w, encryptor)))
Ok(From::from(StreamEncryptedWriter::new(w, svr_cfg.method(), svr_cfg.key(), &local_iv)))
}
CipherCategory::Aead => {
let local_salt = prev_buf;
@@ -282,16 +276,11 @@ pub fn proxy_handshake(remote_stream: TcpStream,
match svr_cfg.method().category() {
CipherCategory::Stream => {
trace!("Got initialize vector {:?}", remote_iv);
let decryptor = crypto::new_stream(svr_cfg.method(),
svr_cfg.key(),
&remote_iv[..],
CryptoMode::Decrypt);
let decrypt_stream = StreamDecryptedReader::new(r, decryptor);
let decrypt_stream = StreamDecryptedReader::new(r, svr_cfg.method(), svr_cfg.key(), &remote_iv);
Ok(From::from(decrypt_stream))
}
CipherCategory::Aead => {
trace!("Got salt {:?}", remote_iv);
let dr = AeadDecryptedReader::new(r, svr_cfg.method(), svr_cfg.key(), &remote_iv[..]);
Ok(From::from(dr))
}

View File

@@ -22,7 +22,7 @@
use std::io::{self, Read, BufRead, Write};
use std::cmp;
use crypto::{StreamCipher, StreamCipherVariant};
use crypto::{CipherType, StreamCipher, StreamCipherVariant, CryptoMode, new_stream};
use super::BUFFER_SIZE;
use super::{EncryptedWrite, DecryptedRead};
@@ -41,11 +41,11 @@ pub struct DecryptedReader<R>
impl<R> DecryptedReader<R>
where R: Read
{
pub fn new(r: R, cipher: StreamCipherVariant) -> DecryptedReader<R> {
pub fn new(r: R, t: CipherType, key: &[u8], iv: &[u8]) -> DecryptedReader<R> {
DecryptedReader {
reader: r,
buffer: Vec::new(),
cipher: cipher,
cipher: new_stream(t, key, iv, CryptoMode::Decrypt),
pos: 0,
sent_final: false,
}
@@ -139,10 +139,10 @@ impl<W> EncryptedWriter<W>
where W: Write
{
/// Creates a new EncryptedWriter
pub fn new(w: W, cipher: StreamCipherVariant) -> EncryptedWriter<W> {
pub fn new(w: W, t: CipherType, key: &[u8], iv: &[u8]) -> EncryptedWriter<W> {
EncryptedWriter {
writer: w,
cipher: cipher,
cipher: new_stream(t, key, iv, CryptoMode::Encrypt),
}
}