88
99// https://github.com/RustCrypto/block-ciphers
1010
11+ use aes:: cipher:: { block_padding:: Pkcs7 , BlockDecryptMut , BlockEncryptMut , KeyIvInit } ;
12+ use p256:: elliptic_curve:: subtle:: ConstantTimeEq ;
13+ use rand:: Rng ;
1114use std:: io:: Cursor ;
1215use std:: ops:: Not ;
1316
14- use aes:: Aes256 ;
15- use block_modes:: { BlockMode , BlockModeError , Cbc } ;
16- use rand:: Rng ;
17- use subtle:: ConstantTimeEq ;
18-
19- use super :: padding:: DtlsPadding ;
2017use crate :: content:: * ;
2118use crate :: error:: * ;
2219use crate :: prf:: * ;
2320use crate :: record_layer:: record_layer_header:: * ;
24- type Aes256Cbc = Cbc < Aes256 , DtlsPadding > ;
21+ type Aes256CbcEnc = cbc:: Encryptor < aes:: Aes256 > ;
22+ type Aes256CbcDec = cbc:: Decryptor < aes:: Aes256 > ;
2523
2624// State needed to handle encrypted input/output
2725#[ derive( Clone ) ]
@@ -71,8 +69,8 @@ impl CryptoCbc {
7169 let mut iv: Vec < u8 > = vec ! [ 0 ; Self :: BLOCK_SIZE ] ;
7270 rand:: thread_rng ( ) . fill ( iv. as_mut_slice ( ) ) ;
7371
74- let write_cbc = Aes256Cbc :: new_var ( & self . local_key , & iv) ?;
75- let encrypted = write_cbc. encrypt_vec ( & payload) ;
72+ let write_cbc = Aes256CbcEnc :: new_from_slices ( & self . local_key , & iv) ?;
73+ let encrypted = write_cbc. encrypt_padded_vec_mut :: < Pkcs7 > ( & payload) ;
7674
7775 // Prepend unencrypte header with encrypted payload
7876 let mut r = vec ! [ ] ;
@@ -100,9 +98,11 @@ impl CryptoCbc {
10098 let body = & body[ Self :: BLOCK_SIZE ..] ;
10199 //TODO: add body.len() check
102100
103- let read_cbc = Aes256Cbc :: new_var ( & self . remote_key , iv) ?;
101+ let read_cbc = Aes256CbcDec :: new_from_slices ( & self . remote_key , iv) ?;
104102
105- let decrypted = read_cbc. decrypt_vec ( body) ?;
103+ let decrypted = read_cbc
104+ . decrypt_padded_vec_mut :: < Pkcs7 > ( body)
105+ . map_err ( |_| Error :: ErrInvalidPacketLength ) ?;
106106
107107 let recv_mac = & decrypted[ decrypted. len ( ) - Self :: MAC_SIZE ..] ;
108108 let decrypted = & decrypted[ 0 ..decrypted. len ( ) - Self :: MAC_SIZE ] ;
@@ -116,7 +116,7 @@ impl CryptoCbc {
116116 ) ?;
117117
118118 if recv_mac. ct_eq ( & mac) . not ( ) . into ( ) {
119- return Err ( BlockModeError . into ( ) ) ;
119+ return Err ( Error :: ErrInvalidMac ) ;
120120 }
121121
122122 let mut d = Vec :: with_capacity ( RECORD_LAYER_HEADER_SIZE + decrypted. len ( ) ) ;
0 commit comments