@@ -123,7 +123,8 @@ impl<Ids: KeyIds> PasswordProtectedKeyEnvelope<Ids> {
123
123
) -> Result < Ids :: Symmetric , PasswordProtectedKeyEnvelopeError > {
124
124
let key = self . unseal_ref ( password) ?;
125
125
#[ allow( deprecated) ]
126
- ctx. set_symmetric_key ( target_keyslot, key) . unwrap ( ) ;
126
+ ctx. set_symmetric_key ( target_keyslot, key)
127
+ . map_err ( |_| PasswordProtectedKeyEnvelopeError :: KeyStoreError ) ?;
127
128
Ok ( target_keyslot)
128
129
}
129
130
@@ -156,16 +157,20 @@ impl<Ids: KeyIds> PasswordProtectedKeyEnvelope<Ids> {
156
157
} ) ?;
157
158
let envelope_key = derive_key ( & kdf_settings, password)
158
159
. map_err ( |_| PasswordProtectedKeyEnvelopeError :: KdfError ) ?;
160
+ let nonce: [ u8 ; 24 ] = self
161
+ . cose_encrypt
162
+ . unprotected
163
+ . iv
164
+ . clone ( )
165
+ . try_into ( )
166
+ . map_err ( |_| {
167
+ PasswordProtectedKeyEnvelopeError :: ParsingError ( "Invalid IV" . to_string ( ) )
168
+ } ) ?;
159
169
160
170
let key_bytes = self
161
171
. cose_encrypt
162
172
. decrypt ( & [ ] , |data, aad| {
163
- xchacha20:: decrypt_xchacha20_poly1305 (
164
- & self . cose_encrypt . unprotected . iv . clone ( ) . try_into ( ) . unwrap ( ) ,
165
- & envelope_key,
166
- data,
167
- aad,
168
- )
173
+ xchacha20:: decrypt_xchacha20_poly1305 ( & nonce, & envelope_key, data, aad)
169
174
} )
170
175
// If decryption fails, the envelope-key is incorrect and thus the password is incorrect
171
176
// since the KDF parameters & salt are guaranteed to be correct
@@ -263,13 +268,16 @@ impl Argon2RawSettings {
263
268
}
264
269
}
265
270
266
- impl Into < Header > for & Argon2RawSettings {
267
- fn into ( self ) -> Header {
271
+ impl From < & Argon2RawSettings > for Header {
272
+ fn from ( settings : & Argon2RawSettings ) -> Header {
268
273
let builder = HeaderBuilder :: new ( )
269
- . value ( ARGON2_ITERATIONS , Integer :: from ( self . iterations ) . into ( ) )
270
- . value ( ARGON2_MEMORY , Integer :: from ( self . memory ) . into ( ) )
271
- . value ( ARGON2_PARALLELISM , Integer :: from ( self . parallelism ) . into ( ) )
272
- . value ( ARGON2_SALT , Value :: from ( self . salt . to_vec ( ) ) ) ;
274
+ . value ( ARGON2_ITERATIONS , Integer :: from ( settings. iterations ) . into ( ) )
275
+ . value ( ARGON2_MEMORY , Integer :: from ( settings. memory ) . into ( ) )
276
+ . value (
277
+ ARGON2_PARALLELISM ,
278
+ Integer :: from ( settings. parallelism ) . into ( ) ,
279
+ )
280
+ . value ( ARGON2_SALT , Value :: from ( settings. salt . to_vec ( ) ) ) ;
273
281
274
282
let mut header = builder. build ( ) ;
275
283
header. alg = Some ( coset:: Algorithm :: PrivateUse ( ALG_ARGON2ID13 ) ) ;
@@ -345,6 +353,9 @@ pub enum PasswordProtectedKeyEnvelopeError {
345
353
/// There is no key for the provided key id in the key store
346
354
#[ error( "Key missing error" ) ]
347
355
KeyMissingError ,
356
+ /// The key store could not be written to, for example due to being read-only
357
+ #[ error( "Could not write to key store" ) ]
358
+ KeyStoreError ,
348
359
}
349
360
350
361
impl From < CoseExtractError > for PasswordProtectedKeyEnvelopeError {
0 commit comments