tlsn_core/config/tls_commit/
mpc.rs1use serde::{Deserialize, Serialize};
4
5const DEFAULT_MAX_RECV_ONLINE: usize = 32;
7
8#[derive(Clone, Debug, Deserialize, Serialize)]
10#[serde(try_from = "unchecked::MpcTlsConfigUnchecked")]
11pub struct MpcTlsConfig {
12 max_sent_data: usize,
14 max_sent_records: Option<usize>,
16 max_recv_data_online: usize,
19 max_recv_data: usize,
21 max_recv_records_online: Option<usize>,
24 defer_decryption_from_start: bool,
27 network: NetworkSetting,
29}
30
31impl MpcTlsConfig {
32 pub fn builder() -> MpcTlsConfigBuilder {
34 MpcTlsConfigBuilder::default()
35 }
36
37 pub fn max_sent_data(&self) -> usize {
39 self.max_sent_data
40 }
41
42 pub fn max_sent_records(&self) -> Option<usize> {
45 self.max_sent_records
46 }
47
48 pub fn max_recv_data_online(&self) -> usize {
50 self.max_recv_data_online
51 }
52
53 pub fn max_recv_data(&self) -> usize {
55 self.max_recv_data
56 }
57
58 pub fn max_recv_records_online(&self) -> Option<usize> {
61 self.max_recv_records_online
62 }
63
64 pub fn defer_decryption_from_start(&self) -> bool {
67 self.defer_decryption_from_start
68 }
69
70 pub fn network(&self) -> NetworkSetting {
72 self.network
73 }
74}
75
76fn validate(config: MpcTlsConfig) -> Result<MpcTlsConfig, MpcTlsConfigError> {
77 if config.max_recv_data_online > config.max_recv_data {
78 return Err(ErrorRepr::InvalidValue {
79 name: "max_recv_data_online",
80 reason: format!(
81 "must be <= max_recv_data ({} > {})",
82 config.max_recv_data_online, config.max_recv_data
83 ),
84 }
85 .into());
86 }
87
88 Ok(config)
89}
90
91#[derive(Debug, Default)]
93pub struct MpcTlsConfigBuilder {
94 max_sent_data: Option<usize>,
95 max_sent_records: Option<usize>,
96 max_recv_data_online: Option<usize>,
97 max_recv_data: Option<usize>,
98 max_recv_records_online: Option<usize>,
99 defer_decryption_from_start: Option<bool>,
100 network: Option<NetworkSetting>,
101}
102
103impl MpcTlsConfigBuilder {
104 pub fn max_sent_data(mut self, max_sent_data: usize) -> Self {
106 self.max_sent_data = Some(max_sent_data);
107 self
108 }
109
110 pub fn max_sent_records(mut self, max_sent_records: usize) -> Self {
112 self.max_sent_records = Some(max_sent_records);
113 self
114 }
115
116 pub fn max_recv_data_online(mut self, max_recv_data_online: usize) -> Self {
118 self.max_recv_data_online = Some(max_recv_data_online);
119 self
120 }
121
122 pub fn max_recv_data(mut self, max_recv_data: usize) -> Self {
124 self.max_recv_data = Some(max_recv_data);
125 self
126 }
127
128 pub fn max_recv_records_online(mut self, max_recv_records_online: usize) -> Self {
131 self.max_recv_records_online = Some(max_recv_records_online);
132 self
133 }
134
135 pub fn defer_decryption_from_start(mut self, defer_decryption_from_start: bool) -> Self {
138 self.defer_decryption_from_start = Some(defer_decryption_from_start);
139 self
140 }
141
142 pub fn network(mut self, network: NetworkSetting) -> Self {
144 self.network = Some(network);
145 self
146 }
147
148 pub fn build(self) -> Result<MpcTlsConfig, MpcTlsConfigError> {
150 let Self {
151 max_sent_data,
152 max_sent_records,
153 max_recv_data_online,
154 max_recv_data,
155 max_recv_records_online,
156 defer_decryption_from_start,
157 network,
158 } = self;
159
160 let max_sent_data = max_sent_data.ok_or(ErrorRepr::MissingField {
161 name: "max_sent_data",
162 })?;
163
164 let max_recv_data_online = max_recv_data_online.unwrap_or(DEFAULT_MAX_RECV_ONLINE);
165 let max_recv_data = max_recv_data.ok_or(ErrorRepr::MissingField {
166 name: "max_recv_data",
167 })?;
168
169 let defer_decryption_from_start = defer_decryption_from_start.unwrap_or(true);
170 let network = network.unwrap_or_default();
171
172 validate(MpcTlsConfig {
173 max_sent_data,
174 max_sent_records,
175 max_recv_data_online,
176 max_recv_data,
177 max_recv_records_online,
178 defer_decryption_from_start,
179 network,
180 })
181 }
182}
183
184#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default)]
189pub enum NetworkSetting {
190 Bandwidth,
193 #[default]
196 Latency,
197}
198
199#[derive(Debug, thiserror::Error)]
201#[error(transparent)]
202pub struct MpcTlsConfigError(#[from] ErrorRepr);
203
204#[derive(Debug, thiserror::Error)]
205enum ErrorRepr {
206 #[error("missing field: {name}")]
207 MissingField { name: &'static str },
208 #[error("invalid value for field({name}): {reason}")]
209 InvalidValue { name: &'static str, reason: String },
210}
211
212mod unchecked {
213 use super::*;
214
215 #[derive(Deserialize)]
216 pub(super) struct MpcTlsConfigUnchecked {
217 max_sent_data: usize,
218 max_sent_records: Option<usize>,
219 max_recv_data_online: usize,
220 max_recv_data: usize,
221 max_recv_records_online: Option<usize>,
222 defer_decryption_from_start: bool,
223 network: NetworkSetting,
224 }
225
226 impl TryFrom<MpcTlsConfigUnchecked> for MpcTlsConfig {
227 type Error = MpcTlsConfigError;
228
229 fn try_from(value: MpcTlsConfigUnchecked) -> Result<Self, Self::Error> {
230 validate(MpcTlsConfig {
231 max_sent_data: value.max_sent_data,
232 max_sent_records: value.max_sent_records,
233 max_recv_data_online: value.max_recv_data_online,
234 max_recv_data: value.max_recv_data,
235 max_recv_records_online: value.max_recv_records_online,
236 defer_decryption_from_start: value.defer_decryption_from_start,
237 network: value.network,
238 })
239 }
240 }
241}