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};
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}