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