@@ -150,11 +150,11 @@ impl SymmetricCryptoKey {
150
150
pub fn to_encoded ( & self ) -> Bytes < BitwardenLegacyKeyContentFormat > {
151
151
let encoded_key = self . to_encoded_raw ( ) ;
152
152
match encoded_key {
153
- EncodedSymmetricKey :: Aes256CbcKey ( _ ) | EncodedSymmetricKey :: Aes256CbcHmacKey ( _) => {
153
+ EncodedSymmetricKey :: LegacyNonCoseKey ( _) => {
154
154
let encoded_key: Vec < u8 > = encoded_key. into ( ) ;
155
155
Bytes :: from ( encoded_key)
156
156
}
157
- EncodedSymmetricKey :: XChaCha20Poly1305Key ( _) => {
157
+ EncodedSymmetricKey :: CoseKey ( _) => {
158
158
let mut encoded_key: Vec < u8 > = encoded_key. into ( ) ;
159
159
pad_key ( & mut encoded_key, Self :: AES256_CBC_HMAC_KEY_LEN + 1 ) ;
160
160
Bytes :: from ( encoded_key)
@@ -191,13 +191,13 @@ impl SymmetricCryptoKey {
191
191
pub ( crate ) fn to_encoded_raw ( & self ) -> EncodedSymmetricKey {
192
192
match self {
193
193
Self :: Aes256CbcKey ( key) => {
194
- EncodedSymmetricKey :: Aes256CbcKey ( key. enc_key . to_vec ( ) . into ( ) )
194
+ EncodedSymmetricKey :: LegacyNonCoseKey ( key. enc_key . to_vec ( ) . into ( ) )
195
195
}
196
196
Self :: Aes256CbcHmacKey ( key) => {
197
197
let mut buf = Vec :: with_capacity ( 64 ) ;
198
198
buf. extend_from_slice ( & key. enc_key ) ;
199
199
buf. extend_from_slice ( & key. mac_key ) ;
200
- EncodedSymmetricKey :: Aes256CbcHmacKey ( buf. into ( ) )
200
+ EncodedSymmetricKey :: LegacyNonCoseKey ( buf. into ( ) )
201
201
}
202
202
Self :: XChaCha20Poly1305Key ( key) => {
203
203
let builder = coset:: CoseKeyBuilder :: new_symmetric_key ( key. enc_key . to_vec ( ) ) ;
@@ -211,7 +211,7 @@ impl SymmetricCryptoKey {
211
211
cose_key. alg = Some ( RegisteredLabelWithPrivate :: PrivateUse (
212
212
cose:: XCHACHA20_POLY1305 ,
213
213
) ) ;
214
- EncodedSymmetricKey :: XChaCha20Poly1305Key (
214
+ EncodedSymmetricKey :: CoseKey (
215
215
cose_key
216
216
. to_vec ( )
217
217
. expect ( "cose key serialization should not fail" )
@@ -280,10 +280,10 @@ impl TryFrom<&Bytes<BitwardenLegacyKeyContentFormat>> for SymmetricCryptoKey {
280
280
// are the raw serializations of the AES256-CBC, and AES256-CBC-HMAC keys. If they
281
281
// are longer, they are COSE keys. The COSE keys are padded to the minimum length of
282
282
// 65 bytes, when serialized to raw byte arrays.
283
- let result = if slice. len ( ) == Self :: AES256_CBC_HMAC_KEY_LEN {
284
- Self :: try_from ( EncodedSymmetricKey :: Aes256CbcHmacKey ( value . clone ( ) ) )
285
- } else if slice . len ( ) == Self :: AES256_CBC_KEY_LEN {
286
- Self :: try_from ( EncodedSymmetricKey :: Aes256CbcKey ( value. clone ( ) ) )
283
+ let result = if slice. len ( ) == Self :: AES256_CBC_HMAC_KEY_LEN
284
+ || slice . len ( ) == Self :: AES256_CBC_KEY_LEN
285
+ {
286
+ Self :: try_from ( EncodedSymmetricKey :: LegacyNonCoseKey ( value. clone ( ) ) )
287
287
} else if slice. len ( ) > Self :: AES256_CBC_HMAC_KEY_LEN {
288
288
let unpadded_value = unpad_key ( slice) ?;
289
289
Ok ( Self :: try_from_cose ( unpadded_value) ?)
@@ -300,12 +300,16 @@ impl TryFrom<EncodedSymmetricKey> for SymmetricCryptoKey {
300
300
301
301
fn try_from ( value : EncodedSymmetricKey ) -> Result < Self , Self :: Error > {
302
302
match value {
303
- EncodedSymmetricKey :: Aes256CbcKey ( key) => {
303
+ EncodedSymmetricKey :: LegacyNonCoseKey ( key)
304
+ if key. as_ref ( ) . len ( ) == Self :: AES256_CBC_KEY_LEN =>
305
+ {
304
306
let mut enc_key = Box :: pin ( GenericArray :: < u8 , U32 > :: default ( ) ) ;
305
307
enc_key. copy_from_slice ( & key. as_ref ( ) [ ..Self :: AES256_CBC_KEY_LEN ] ) ;
306
308
Ok ( Self :: Aes256CbcKey ( Aes256CbcKey { enc_key } ) )
307
309
}
308
- EncodedSymmetricKey :: Aes256CbcHmacKey ( key) => {
310
+ EncodedSymmetricKey :: LegacyNonCoseKey ( key)
311
+ if key. as_ref ( ) . len ( ) == Self :: AES256_CBC_HMAC_KEY_LEN =>
312
+ {
309
313
let mut enc_key = Box :: pin ( GenericArray :: < u8 , U32 > :: default ( ) ) ;
310
314
enc_key. copy_from_slice ( & key. as_ref ( ) [ ..32 ] ) ;
311
315
@@ -317,7 +321,8 @@ impl TryFrom<EncodedSymmetricKey> for SymmetricCryptoKey {
317
321
mac_key,
318
322
} ) )
319
323
}
320
- EncodedSymmetricKey :: XChaCha20Poly1305Key ( key) => Self :: try_from_cose ( key. as_ref ( ) ) ,
324
+ EncodedSymmetricKey :: CoseKey ( key) => Self :: try_from_cose ( key. as_ref ( ) ) ,
325
+ _ => Err ( CryptoError :: InvalidKey ) ,
321
326
}
322
327
}
323
328
}
@@ -390,26 +395,24 @@ fn unpad_key(key_bytes: &[u8]) -> Result<&[u8], CryptoError> {
390
395
391
396
/// An enum to represent the different encodings of symmetric crypto keys.
392
397
pub enum EncodedSymmetricKey {
393
- Aes256CbcKey ( Bytes < BitwardenLegacyKeyContentFormat > ) ,
394
- Aes256CbcHmacKey ( Bytes < BitwardenLegacyKeyContentFormat > ) ,
395
- XChaCha20Poly1305Key ( Bytes < CoseKeyContentFormat > ) ,
398
+ /// An Aes256-CBC-HMAC key, or a Aes256-CBC key
399
+ LegacyNonCoseKey ( Bytes < BitwardenLegacyKeyContentFormat > ) ,
400
+ /// A symmetric key encoded as a COSE key
401
+ CoseKey ( Bytes < CoseKeyContentFormat > ) ,
396
402
}
397
- impl Into < Vec < u8 > > for EncodedSymmetricKey {
398
- fn into ( self ) -> Vec < u8 > {
399
- match self {
400
- EncodedSymmetricKey :: Aes256CbcKey ( key) => key. as_ref ( ) . to_vec ( ) ,
401
- EncodedSymmetricKey :: Aes256CbcHmacKey ( key) => key. as_ref ( ) . to_vec ( ) ,
402
- EncodedSymmetricKey :: XChaCha20Poly1305Key ( key) => key. as_ref ( ) . to_vec ( ) ,
403
+ impl From < EncodedSymmetricKey > for Vec < u8 > {
404
+ fn from ( val : EncodedSymmetricKey ) -> Self {
405
+ match val {
406
+ EncodedSymmetricKey :: LegacyNonCoseKey ( key) => key. to_vec ( ) ,
407
+ EncodedSymmetricKey :: CoseKey ( key) => key. to_vec ( ) ,
403
408
}
404
409
}
405
410
}
406
411
impl EncodedSymmetricKey {
407
412
pub fn content_format ( & self ) -> ContentFormat {
408
413
match self {
409
- EncodedSymmetricKey :: Aes256CbcKey ( _) | EncodedSymmetricKey :: Aes256CbcHmacKey ( _) => {
410
- ContentFormat :: BitwardenLegacyKey
411
- }
412
- EncodedSymmetricKey :: XChaCha20Poly1305Key ( _) => ContentFormat :: CoseKey ,
414
+ EncodedSymmetricKey :: LegacyNonCoseKey ( _) => ContentFormat :: BitwardenLegacyKey ,
415
+ EncodedSymmetricKey :: CoseKey ( _) => ContentFormat :: CoseKey ,
413
416
}
414
417
}
415
418
}
0 commit comments