1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4pub struct SnapshotOptions {
5 pub compression: Compression,
6 pub encryption: Option<SnapshotEncryption>,
7}
8
9impl Default for SnapshotOptions {
10 fn default() -> Self {
11 Self {
12 compression: Compression::Gzip { level: 1 },
13 encryption: None,
14 }
15 }
16}
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
19pub enum Compression {
20 None,
21 Gzip { level: u32 },
22}
23
24#[derive(Debug, Clone, PartialEq, Eq)]
25pub struct EncryptionKey {
26 pub key_id: String,
27 pub key: [u8; 32],
28}
29
30impl EncryptionKey {
31 pub fn new(key_id: impl Into<String>, key: [u8; 32]) -> Self {
32 Self {
33 key_id: key_id.into(),
34 key,
35 }
36 }
37}
38
39#[derive(Debug, Clone, PartialEq, Eq)]
40pub struct SnapshotPassword {
41 pub key_id: String,
42 pub(crate) password: Vec<u8>,
43 pub params: PasswordKdfParams,
44}
45
46impl SnapshotPassword {
47 pub fn new(key_id: impl Into<String>, password: impl AsRef<[u8]>) -> Self {
48 Self {
49 key_id: key_id.into(),
50 password: password.as_ref().to_vec(),
51 params: PasswordKdfParams::interactive(),
52 }
53 }
54
55 pub fn with_params(
56 key_id: impl Into<String>,
57 password: impl AsRef<[u8]>,
58 params: PasswordKdfParams,
59 ) -> Self {
60 Self {
61 key_id: key_id.into(),
62 password: password.as_ref().to_vec(),
63 params,
64 }
65 }
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
69pub struct PasswordKdfParams {
70 pub memory_cost_kib: u32,
71 pub time_cost: u32,
72 pub parallelism: u32,
73}
74
75impl PasswordKdfParams {
76 #[must_use]
77 pub fn interactive() -> Self {
78 Self {
79 memory_cost_kib: 19 * 1024,
80 time_cost: 2,
81 parallelism: 1,
82 }
83 }
84}
85
86impl Default for PasswordKdfParams {
87 fn default() -> Self {
88 Self::interactive()
89 }
90}
91
92#[derive(Debug, Clone, PartialEq, Eq)]
93pub enum SnapshotEncryption {
94 Key(EncryptionKey),
95 Password(SnapshotPassword),
96}
97
98impl From<EncryptionKey> for SnapshotEncryption {
99 fn from(value: EncryptionKey) -> Self {
100 Self::Key(value)
101 }
102}
103
104impl From<SnapshotPassword> for SnapshotEncryption {
105 fn from(value: SnapshotPassword) -> Self {
106 Self::Password(value)
107 }
108}
109
110pub type SnapshotCredentials = SnapshotEncryption;