Skip to content

Commit fc5b5dd

Browse files
SeungMin Leesgkim126
authored andcommitted
Replace crates related to the 256-CBC and 128-CTR mode to other crates
1 parent 33fa64a commit fc5b5dd

File tree

3 files changed

+60
-50
lines changed

3 files changed

+60
-50
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ sha3 = "0.8.2"
1515
ripemd160 = "0.8.0"
1616
digest = "0.8"
1717
blake2 = "0.8.1"
18+
block-modes = "0.3.3"
19+
aes = "0.3.2"
20+
ctr = "0.3.2"
21+
hex = "0.4.0"
1822

1923
[dev-dependencies]
2024
rand = "0.6.1"

src/aes.rs

Lines changed: 53 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -14,68 +14,45 @@
1414
// You should have received a copy of the GNU Affero General Public License
1515
// along with this program. If not, see <https://www.gnu.org/licenses/>.
1616

17+
use aes::{Aes128, Aes256};
18+
use block_modes::block_padding::Pkcs7;
19+
use block_modes::InvalidKeyIvLength;
20+
use block_modes::{BlockMode, Cbc};
21+
use ctr;
22+
use ctr::stream_cipher::generic_array::GenericArray;
23+
use ctr::stream_cipher::{NewStreamCipher, SyncStreamCipher, SyncStreamCipherSeek};
1724
use primitives::H256;
18-
use rcrypto::aes::KeySize::KeySize256;
19-
use rcrypto::aes::{cbc_decryptor, cbc_encryptor};
20-
use rcrypto::aessafe::AesSafe128Encryptor;
21-
use rcrypto::blockmodes::{CtrMode, PkcsPadding};
22-
use rcrypto::buffer::{BufferResult, ReadBuffer, RefReadBuffer, RefWriteBuffer, WriteBuffer};
23-
pub use rcrypto::symmetriccipher::SymmetricCipherError;
24-
use rcrypto::symmetriccipher::{Decryptor, Encryptor};
2525

2626
use super::error::SymmError;
2727

28-
fn is_underflow(result: BufferResult) -> bool {
29-
match result {
30-
BufferResult::BufferUnderflow => true,
31-
BufferResult::BufferOverflow => false,
32-
}
33-
}
34-
35-
// AES-256/CBC/Pkcs encryption.
36-
pub fn encrypt(data: &[u8], key: &H256, iv: &u128) -> Result<Vec<u8>, SymmetricCipherError> {
37-
let mut encryptor = cbc_encryptor(KeySize256, key, &iv.to_be_bytes(), PkcsPadding);
38-
39-
let mut final_result = Vec::<u8>::new();
40-
let mut read_buffer = RefReadBuffer::new(data);
41-
let mut buffer = [0; 4096];
42-
let mut write_buffer = RefWriteBuffer::new(&mut buffer);
4328

29+
type Aes256Cbc = Cbc<Aes256, Pkcs7>;
30+
type Aes128Ctr = ctr::Ctr128<Aes128>;
4431

45-
let mut finish = false;
46-
while !finish {
47-
finish = is_underflow(encryptor.encrypt(&mut read_buffer, &mut write_buffer, true)?);
48-
final_result.extend(write_buffer.take_read_buffer().take_remaining().iter().cloned());
49-
}
32+
// AES-256/CBC/Pkcs encryption.
33+
pub fn encrypt(data: &[u8], key: &H256, iv: &u128) -> Result<Vec<u8>, InvalidKeyIvLength> {
34+
let cipher = Aes256Cbc::new_var(&key, &iv.to_be_bytes())?;
35+
let result = cipher.encrypt_vec(data);
5036

51-
Ok(final_result)
37+
Ok(result)
5238
}
5339

5440
// AES-256/CBC/Pkcs decryption.
55-
pub fn decrypt(encrypted_data: &[u8], key: &H256, iv: &u128) -> Result<Vec<u8>, SymmetricCipherError> {
56-
let mut decryptor = cbc_decryptor(KeySize256, key, &iv.to_be_bytes(), PkcsPadding);
57-
58-
let mut final_result = Vec::<u8>::new();
59-
let mut read_buffer = RefReadBuffer::new(encrypted_data);
60-
let mut buffer = [0; 4096];
61-
let mut write_buffer = RefWriteBuffer::new(&mut buffer);
62-
63-
let mut finish = false;
64-
while !finish {
65-
finish = is_underflow(decryptor.decrypt(&mut read_buffer, &mut write_buffer, true)?);
66-
final_result.extend(write_buffer.take_read_buffer().take_remaining().iter().cloned());
67-
}
41+
pub fn decrypt(encrypted_data: &[u8], key: &H256, iv: &u128) -> Result<Vec<u8>, InvalidKeyIvLength> {
42+
let cipher = Aes256Cbc::new_var(&key, &iv.to_be_bytes())?;
43+
let result = cipher.decrypt_vec(&encrypted_data.to_vec()).unwrap();
6844

69-
Ok(final_result)
45+
Ok(result)
7046
}
7147

7248
/// Encrypt a message (CTR mode).
7349
///
7450
/// Key (`k`) length and initialisation vector (`iv`) length have to be 16 bytes each.
7551
/// An error is returned if the input lengths are invalid.
7652
pub fn encrypt_128_ctr(k: &[u8], iv: &[u8], plain: &[u8], dest: &mut [u8]) -> Result<(), SymmError> {
77-
let mut encryptor = CtrMode::new(AesSafe128Encryptor::new(k), iv.to_vec());
78-
encryptor.encrypt(&mut RefReadBuffer::new(plain), &mut RefWriteBuffer::new(dest), true)?;
53+
let mut cipher = Aes128Ctr::new(&GenericArray::from_slice(k), &GenericArray::from_slice(iv));
54+
dest.copy_from_slice(plain);
55+
cipher.apply_keystream(dest);
7956
Ok(())
8057
}
8158

@@ -84,8 +61,10 @@ pub fn encrypt_128_ctr(k: &[u8], iv: &[u8], plain: &[u8], dest: &mut [u8]) -> Re
8461
/// Key (`k`) length and initialisation vector (`iv`) length have to be 16 bytes each.
8562
/// An error is returned if the input lengths are invalid.
8663
pub fn decrypt_128_ctr(k: &[u8], iv: &[u8], encrypted: &[u8], dest: &mut [u8]) -> Result<(), SymmError> {
87-
let mut encryptor = CtrMode::new(AesSafe128Encryptor::new(k), iv.to_vec());
88-
encryptor.decrypt(&mut RefReadBuffer::new(encrypted), &mut RefWriteBuffer::new(dest), true)?;
64+
let mut cipher = Aes128Ctr::new(&GenericArray::from_slice(k), &GenericArray::from_slice(iv));
65+
dest.copy_from_slice(encrypted);
66+
cipher.seek(0);
67+
cipher.apply_keystream(dest);
8968
Ok(())
9069
}
9170

@@ -146,4 +125,32 @@ mod tests {
146125
let decrypted = decrypt(&encrypted, &key, &iv).unwrap();
147126
assert_eq!(input, decrypted);
148127
}
128+
129+
#[test]
130+
fn aes_256_cbc_encrypt_decrypt() {
131+
let message = [1, 2, 3, 4, 5, 6, 7, 8];
132+
let key = H256([0; 32]);
133+
let iv = 0;
134+
135+
let encrypted_data = encrypt(&message, &key, &iv).ok().unwrap();
136+
assert_eq!(encrypted_data, [45, 34, 87, 122, 38, 50, 190, 242, 253, 245, 138, 7, 196, 24, 58, 91]);
137+
138+
let decrypted_data = decrypt(&encrypted_data[..], &key, &iv).ok().unwrap();
139+
assert_eq!(message, &decrypted_data[..]);
140+
}
141+
142+
#[test]
143+
fn aes_128_ctr_encrypt_decrypt() {
144+
let plaintext = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
145+
let key = [1; 16];
146+
let iv = [1; 16];
147+
let mut dest = [0; 10];
148+
149+
let _ = encrypt_128_ctr(&key, &iv, &plaintext, &mut dest);
150+
assert_eq!(dest, [94, 118, 231, 156, 139, 128, 146, 51, 129, 171]);
151+
152+
let ciphertext = dest;
153+
let _ = decrypt_128_ctr(&key, &iv, &ciphertext, &mut dest);
154+
assert_eq!(plaintext, dest);
155+
}
149156
}

src/error.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,12 @@ quick_error! {
4747

4848
#[allow(deprecated)]
4949
mod errors {
50-
use rcrypto;
5150
use ring;
5251

5352
quick_error! {
5453
#[derive(Debug)]
5554
pub enum SymmError wraps PrivSymmErr {
56-
RustCrypto(e: rcrypto::symmetriccipher::SymmetricCipherError) {
55+
RustCrypto(e: block_modes::InvalidKeyIvLength) {
5756
display("symmetric crypto error")
5857
from()
5958
}
@@ -74,8 +73,8 @@ mod errors {
7473
}
7574
}
7675

77-
impl From<rcrypto::symmetriccipher::SymmetricCipherError> for SymmError {
78-
fn from(e: rcrypto::symmetriccipher::SymmetricCipherError) -> SymmError {
76+
impl From<block_modes::InvalidKeyIvLength> for SymmError {
77+
fn from(e: block_modes::InvalidKeyIvLength) -> SymmError {
7978
SymmError(PrivSymmErr::RustCrypto(e))
8079
}
8180
}

0 commit comments

Comments
 (0)