Skip to main content

bitwarden_vault/cipher/blob/
mod.rs

1mod conversions;
2mod encryption;
3mod sealed;
4mod v1;
5
6use bitwarden_crypto::{
7    generate_versioned_sealable,
8    safe::{DataEnvelopeNamespace, SealableData, SealableVersionedData},
9};
10#[allow(unused_imports)]
11pub(crate) use encryption::{
12    BlobEncryptionError, decrypt_blob_cipher, encrypt_blob_cipher, is_blob_encrypted,
13    is_legacy_cipher,
14};
15use sealed::{SealedCipherBlob, SealedCipherBlobError};
16use serde::{Deserialize, Serialize};
17use v1::CipherBlobV1;
18
19generate_versioned_sealable!(
20    CipherBlob,
21    DataEnvelopeNamespace::VaultItem,
22    [CipherBlobV1 => "1"]
23);
24
25pub(crate) type CipherBlobLatest = CipherBlobV1;
26
27#[cfg(test)]
28mod tests {
29    use super::{CipherBlob, v1::*};
30    use crate::cipher::secure_note::SecureNoteType;
31
32    #[test]
33    fn test_versioned_enum_format() {
34        let blob = CipherBlobV1 {
35            name: "Test".to_string(),
36            notes: None,
37            type_data: CipherTypeDataV1::SecureNote(SecureNoteDataV1 {
38                r#type: SecureNoteType::Generic,
39            }),
40            fields: Vec::new(),
41            password_history: Vec::new(),
42        };
43        let versioned: CipherBlob = blob.into();
44        let json = serde_json::to_value(&versioned).unwrap();
45
46        assert_eq!(json["version"], "1");
47        assert!(json["content"].is_object());
48        assert_eq!(json["content"]["name"], "Test");
49    }
50
51    #[test]
52    fn test_from_conversion() {
53        let blob = CipherBlobV1 {
54            name: "Test".to_string(),
55            notes: None,
56            type_data: CipherTypeDataV1::SecureNote(SecureNoteDataV1 {
57                r#type: SecureNoteType::Generic,
58            }),
59            fields: Vec::new(),
60            password_history: Vec::new(),
61        };
62        let versioned: CipherBlob = blob.clone().into();
63        assert_eq!(versioned, CipherBlob::CipherBlobV1(blob));
64    }
65}