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 } ;
1724use 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
2626use 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.
7652pub 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.
8663pub 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}
0 commit comments