@@ -29,36 +29,50 @@ pub fn encrypt_in_place<'b>(
2929 buffer : & ' b mut [ u8 ] ,
3030 pos : usize ,
3131) -> Result < & ' b [ u8 ] > {
32- let encryption_key = EncryptionKey :: derive_from_password (
33- password. as_ref ( ) ,
34- & params. kdf ,
35- params. encryption . key_size ( ) ,
36- ) ?;
32+ let key_size = params. encryption . key_size ( ) ;
33+ let algo_params_invalid_error = Error :: AlgorithmParametersInvalid {
34+ oid : params. encryption . oid ( ) ,
35+ } ;
36+ if key_size > MAX_KEY_LEN {
37+ return Err ( algo_params_invalid_error) ;
38+ }
39+ let encryption_key =
40+ EncryptionKey :: derive_from_password ( password. as_ref ( ) , & params. kdf , key_size) ?;
3741
3842 match params. encryption {
3943 EncryptionScheme :: Aes128Cbc { iv } => {
4044 let cipher = Aes128Cbc :: new_from_slices ( encryption_key. as_slice ( ) , iv)
41- . map_err ( |_| Error :: Crypto ) ?;
42- cipher. encrypt ( buffer, pos) . map_err ( |_| Error :: Crypto )
45+ . map_err ( |_| algo_params_invalid_error) ?;
46+ cipher
47+ . encrypt ( buffer, pos)
48+ . map_err ( |_| Error :: EncryptFailed )
4349 }
4450 EncryptionScheme :: Aes192Cbc { iv } => {
4551 let cipher = Aes192Cbc :: new_from_slices ( encryption_key. as_slice ( ) , iv)
46- . map_err ( |_| Error :: Crypto ) ?;
47- cipher. encrypt ( buffer, pos) . map_err ( |_| Error :: Crypto )
52+ . map_err ( |_| algo_params_invalid_error) ?;
53+ cipher
54+ . encrypt ( buffer, pos)
55+ . map_err ( |_| Error :: EncryptFailed )
4856 }
4957 EncryptionScheme :: Aes256Cbc { iv } => {
5058 let cipher = Aes256Cbc :: new_from_slices ( encryption_key. as_slice ( ) , iv)
51- . map_err ( |_| Error :: Crypto ) ?;
52- cipher. encrypt ( buffer, pos) . map_err ( |_| Error :: Crypto )
59+ . map_err ( |_| algo_params_invalid_error) ?;
60+ cipher
61+ . encrypt ( buffer, pos)
62+ . map_err ( |_| Error :: EncryptFailed )
5363 }
5464 #[ cfg( feature = "3des" ) ]
5565 EncryptionScheme :: DesEde3Cbc { iv } => {
5666 let cipher = DesEde3Cbc :: new_from_slices ( encryption_key. as_slice ( ) , iv)
57- . map_err ( |_| Error :: Crypto ) ?;
58- cipher. encrypt ( buffer, pos) . map_err ( |_| Error :: Crypto )
67+ . map_err ( |_| algo_params_invalid_error) ?;
68+ cipher
69+ . encrypt ( buffer, pos)
70+ . map_err ( |_| Error :: EncryptFailed )
5971 }
6072 #[ cfg( feature = "des-insecure" ) ]
61- EncryptionScheme :: DesCbc { .. } => Err ( Error :: Crypto ) ,
73+ EncryptionScheme :: DesCbc { .. } => Err ( Error :: UnsupportedAlgorithm {
74+ oid : super :: DES_CBC_OID ,
75+ } ) ,
6276 }
6377}
6478
@@ -74,33 +88,36 @@ pub fn decrypt_in_place<'a>(
7488 params. encryption . key_size ( ) ,
7589 ) ?;
7690
91+ let algo_params_invalid_error = Error :: AlgorithmParametersInvalid {
92+ oid : params. encryption . oid ( ) ,
93+ } ;
7794 match params. encryption {
7895 EncryptionScheme :: Aes128Cbc { iv } => {
7996 let cipher = Aes128Cbc :: new_from_slices ( encryption_key. as_slice ( ) , iv)
80- . map_err ( |_| Error :: Crypto ) ?;
81- cipher. decrypt ( buffer) . map_err ( |_| Error :: Crypto )
97+ . map_err ( |_| algo_params_invalid_error ) ?;
98+ cipher. decrypt ( buffer) . map_err ( |_| Error :: DecryptFailed )
8299 }
83100 EncryptionScheme :: Aes192Cbc { iv } => {
84101 let cipher = Aes192Cbc :: new_from_slices ( encryption_key. as_slice ( ) , iv)
85- . map_err ( |_| Error :: Crypto ) ?;
86- cipher. decrypt ( buffer) . map_err ( |_| Error :: Crypto )
102+ . map_err ( |_| algo_params_invalid_error ) ?;
103+ cipher. decrypt ( buffer) . map_err ( |_| Error :: DecryptFailed )
87104 }
88105 EncryptionScheme :: Aes256Cbc { iv } => {
89106 let cipher = Aes256Cbc :: new_from_slices ( encryption_key. as_slice ( ) , iv)
90- . map_err ( |_| Error :: Crypto ) ?;
91- cipher. decrypt ( buffer) . map_err ( |_| Error :: Crypto )
107+ . map_err ( |_| algo_params_invalid_error ) ?;
108+ cipher. decrypt ( buffer) . map_err ( |_| Error :: DecryptFailed )
92109 }
93110 #[ cfg( feature = "3des" ) ]
94111 EncryptionScheme :: DesEde3Cbc { iv } => {
95112 let cipher = DesEde3Cbc :: new_from_slices ( encryption_key. as_slice ( ) , iv)
96- . map_err ( |_| Error :: Crypto ) ?;
97- cipher. decrypt ( buffer) . map_err ( |_| Error :: Crypto )
113+ . map_err ( |_| algo_params_invalid_error ) ?;
114+ cipher. decrypt ( buffer) . map_err ( |_| Error :: DecryptFailed )
98115 }
99116 #[ cfg( feature = "des-insecure" ) ]
100117 EncryptionScheme :: DesCbc { iv } => {
101118 let cipher = DesCbc :: new_from_slices ( encryption_key. as_slice ( ) , iv)
102- . map_err ( |_| Error :: Crypto ) ?;
103- cipher. decrypt ( buffer) . map_err ( |_| Error :: Crypto )
119+ . map_err ( |_| algo_params_invalid_error ) ?;
120+ cipher. decrypt ( buffer) . map_err ( |_| Error :: DecryptFailed )
104121 }
105122 }
106123}
@@ -115,10 +132,15 @@ struct EncryptionKey {
115132impl EncryptionKey {
116133 /// Derive an encryption key using the supplied PBKDF parameters.
117134 pub fn derive_from_password ( password : & [ u8 ] , kdf : & Kdf < ' _ > , key_size : usize ) -> Result < Self > {
135+ // if the kdf params defined a key length, ensure it matches the required key size
136+ if let Some ( len) = kdf. key_length ( ) {
137+ if key_size != len. into ( ) {
138+ return Err ( Error :: AlgorithmParametersInvalid { oid : kdf. oid ( ) } ) ;
139+ }
140+ }
141+
118142 match kdf {
119143 Kdf :: Pbkdf2 ( pbkdf2_params) => {
120- validate_key_length ( key_size, pbkdf2_params. key_length . map ( Into :: into) ) ?;
121-
122144 let key = match pbkdf2_params. prf {
123145 #[ cfg( feature = "sha1" ) ]
124146 Pbkdf2Prf :: HmacWithSha1 => EncryptionKey :: derive_with_pbkdf2 :: < sha1:: Sha1 > (
@@ -127,7 +149,11 @@ impl EncryptionKey {
127149 key_size,
128150 ) ,
129151 #[ cfg( not( feature = "sha1" ) ) ]
130- Pbkdf2Prf :: HmacWithSha1 => return Err ( Error :: Crypto ) ,
152+ Pbkdf2Prf :: HmacWithSha1 => {
153+ return Err ( Error :: UnsupportedAlgorithm {
154+ oid : super :: HMAC_WITH_SHA1_OID ,
155+ } )
156+ }
131157 Pbkdf2Prf :: HmacWithSha224 => EncryptionKey :: derive_with_pbkdf2 :: < sha2:: Sha224 > (
132158 password,
133159 pbkdf2_params,
@@ -181,17 +207,16 @@ impl EncryptionKey {
181207 params : & ScryptParams < ' _ > ,
182208 length : usize ,
183209 ) -> Result < Self > {
184- // TODO(tarcieri): move to `derive_from_password`?
185- validate_key_length ( length, params. key_length . map ( Into :: into) ) ?;
186-
187210 let mut buffer = [ 0u8 ; MAX_KEY_LEN ] ;
188211 scrypt (
189212 password,
190213 params. salt ,
191214 & params. try_into ( ) ?,
192215 & mut buffer[ ..length] ,
193216 )
194- . map_err ( |_| Error :: Crypto ) ?;
217+ . map_err ( |_| Error :: AlgorithmParametersInvalid {
218+ oid : super :: SCRYPT_OID ,
219+ } ) ?;
195220
196221 Ok ( Self { buffer, length } )
197222 }
@@ -201,20 +226,3 @@ impl EncryptionKey {
201226 & self . buffer [ ..self . length ]
202227 }
203228}
204-
205- /// Validate key length
206- // TODO(tarcieri): move to `EncryptionKey::derive_from_password`?
207- fn validate_key_length ( requested_len : usize , params_len : Option < usize > ) -> Result < ( ) > {
208- // Ensure key length matches what is expected for the given algorithm
209- if let Some ( len) = params_len {
210- if requested_len != len {
211- return Err ( Error :: Crypto ) ;
212- }
213- }
214-
215- if requested_len > MAX_KEY_LEN {
216- return Err ( Error :: Crypto ) ;
217- }
218-
219- Ok ( ( ) )
220- }
0 commit comments