Skip to content

Commit 24f1431

Browse files
committed
Simplify encoded symmetric key
1 parent 625b830 commit 24f1431

File tree

2 files changed

+29
-26
lines changed

2 files changed

+29
-26
lines changed

crates/bitwarden-crypto/src/enc_string/asymmetric.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ impl UnsignedSharedKey {
169169
Ok(UnsignedSharedKey::Rsa2048_OaepSha1_B64 {
170170
data: encrypt_rsa2048_oaep_sha1(
171171
rsa_public_key,
172-
&encapsulated_key.to_encoded().as_ref().to_vec(),
172+
encapsulated_key.to_encoded().as_ref(),
173173
)?,
174174
})
175175
}

crates/bitwarden-crypto/src/keys/symmetric_crypto_key.rs

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,11 @@ impl SymmetricCryptoKey {
150150
pub fn to_encoded(&self) -> Bytes<BitwardenLegacyKeyContentFormat> {
151151
let encoded_key = self.to_encoded_raw();
152152
match encoded_key {
153-
EncodedSymmetricKey::Aes256CbcKey(_) | EncodedSymmetricKey::Aes256CbcHmacKey(_) => {
153+
EncodedSymmetricKey::LegacyNonCoseKey(_) => {
154154
let encoded_key: Vec<u8> = encoded_key.into();
155155
Bytes::from(encoded_key)
156156
}
157-
EncodedSymmetricKey::XChaCha20Poly1305Key(_) => {
157+
EncodedSymmetricKey::CoseKey(_) => {
158158
let mut encoded_key: Vec<u8> = encoded_key.into();
159159
pad_key(&mut encoded_key, Self::AES256_CBC_HMAC_KEY_LEN + 1);
160160
Bytes::from(encoded_key)
@@ -191,13 +191,13 @@ impl SymmetricCryptoKey {
191191
pub(crate) fn to_encoded_raw(&self) -> EncodedSymmetricKey {
192192
match self {
193193
Self::Aes256CbcKey(key) => {
194-
EncodedSymmetricKey::Aes256CbcKey(key.enc_key.to_vec().into())
194+
EncodedSymmetricKey::LegacyNonCoseKey(key.enc_key.to_vec().into())
195195
}
196196
Self::Aes256CbcHmacKey(key) => {
197197
let mut buf = Vec::with_capacity(64);
198198
buf.extend_from_slice(&key.enc_key);
199199
buf.extend_from_slice(&key.mac_key);
200-
EncodedSymmetricKey::Aes256CbcHmacKey(buf.into())
200+
EncodedSymmetricKey::LegacyNonCoseKey(buf.into())
201201
}
202202
Self::XChaCha20Poly1305Key(key) => {
203203
let builder = coset::CoseKeyBuilder::new_symmetric_key(key.enc_key.to_vec());
@@ -211,7 +211,7 @@ impl SymmetricCryptoKey {
211211
cose_key.alg = Some(RegisteredLabelWithPrivate::PrivateUse(
212212
cose::XCHACHA20_POLY1305,
213213
));
214-
EncodedSymmetricKey::XChaCha20Poly1305Key(
214+
EncodedSymmetricKey::CoseKey(
215215
cose_key
216216
.to_vec()
217217
.expect("cose key serialization should not fail")
@@ -280,10 +280,10 @@ impl TryFrom<&Bytes<BitwardenLegacyKeyContentFormat>> for SymmetricCryptoKey {
280280
// are the raw serializations of the AES256-CBC, and AES256-CBC-HMAC keys. If they
281281
// are longer, they are COSE keys. The COSE keys are padded to the minimum length of
282282
// 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()))
287287
} else if slice.len() > Self::AES256_CBC_HMAC_KEY_LEN {
288288
let unpadded_value = unpad_key(slice)?;
289289
Ok(Self::try_from_cose(unpadded_value)?)
@@ -300,12 +300,16 @@ impl TryFrom<EncodedSymmetricKey> for SymmetricCryptoKey {
300300

301301
fn try_from(value: EncodedSymmetricKey) -> Result<Self, Self::Error> {
302302
match value {
303-
EncodedSymmetricKey::Aes256CbcKey(key) => {
303+
EncodedSymmetricKey::LegacyNonCoseKey(key)
304+
if key.as_ref().len() == Self::AES256_CBC_KEY_LEN =>
305+
{
304306
let mut enc_key = Box::pin(GenericArray::<u8, U32>::default());
305307
enc_key.copy_from_slice(&key.as_ref()[..Self::AES256_CBC_KEY_LEN]);
306308
Ok(Self::Aes256CbcKey(Aes256CbcKey { enc_key }))
307309
}
308-
EncodedSymmetricKey::Aes256CbcHmacKey(key) => {
310+
EncodedSymmetricKey::LegacyNonCoseKey(key)
311+
if key.as_ref().len() == Self::AES256_CBC_HMAC_KEY_LEN =>
312+
{
309313
let mut enc_key = Box::pin(GenericArray::<u8, U32>::default());
310314
enc_key.copy_from_slice(&key.as_ref()[..32]);
311315

@@ -317,7 +321,8 @@ impl TryFrom<EncodedSymmetricKey> for SymmetricCryptoKey {
317321
mac_key,
318322
}))
319323
}
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),
321326
}
322327
}
323328
}
@@ -390,26 +395,24 @@ fn unpad_key(key_bytes: &[u8]) -> Result<&[u8], CryptoError> {
390395

391396
/// An enum to represent the different encodings of symmetric crypto keys.
392397
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>),
396402
}
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(),
403408
}
404409
}
405410
}
406411
impl EncodedSymmetricKey {
407412
pub fn content_format(&self) -> ContentFormat {
408413
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,
413416
}
414417
}
415418
}

0 commit comments

Comments
 (0)