Skip to content

Commit 3a7b009

Browse files
committed
Simplify Deserializer logic
1 parent 7522af5 commit 3a7b009

12 files changed

+54
-83
lines changed

Cargo.lock

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/src/format.rs

-22
This file was deleted.

examples/src/lib.rs

-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
extern crate alloc;
22

3-
mod format;
43
pub mod simple;
54

65
#[cfg(test)]
76
mod simple_malicious;
8-
9-
pub use format::Binary;

examples/src/simple.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -391,13 +391,12 @@ mod tests {
391391

392392
use manul::{
393393
session::{signature::Keypair, SessionOutcome},
394-
testing::{run_sync, TestSessionParams, TestSigner, TestVerifier},
394+
testing::{run_sync, Binary, TestSessionParams, TestSigner, TestVerifier},
395395
};
396396
use rand_core::OsRng;
397397
use tracing_subscriber::EnvFilter;
398398

399399
use super::{Inputs, Round1};
400-
use crate::Binary;
401400

402401
#[test]
403402
fn round() {

examples/src/simple_malicious.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,14 @@ use manul::{
77
Round,
88
},
99
session::{signature::Keypair, Serializer},
10-
testing::{round_override, run_sync, RoundOverride, RoundWrapper, TestSessionParams, TestSigner, TestVerifier},
10+
testing::{
11+
round_override, run_sync, Binary, RoundOverride, RoundWrapper, TestSessionParams, TestSigner, TestVerifier,
12+
},
1113
};
1214
use rand_core::{CryptoRngCore, OsRng};
1315
use tracing_subscriber::EnvFilter;
1416

15-
use crate::{
16-
simple::{Inputs, Round1, Round1Message, Round2, Round2Message},
17-
Binary,
18-
};
17+
use crate::simple::{Inputs, Round1, Round1Message, Round2, Round2Message};
1918

2019
#[derive(Debug, Clone, Copy)]
2120
enum Behavior {

examples/tests/async_runner.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,9 @@ use manul::{
1010
signature::Keypair, CanFinalize, LocalError, MessageBundle, RoundOutcome, Session, SessionId,
1111
SessionParameters, SessionReport,
1212
},
13-
testing::{TestSessionParams, TestSigner},
14-
};
15-
use manul_example::{
16-
simple::{Inputs, Round1, SimpleProtocol},
17-
Binary,
13+
testing::{Binary, TestSessionParams, TestSigner},
1814
};
15+
use manul_example::simple::{Inputs, Round1, SimpleProtocol};
1916
use rand::Rng;
2017
use rand_core::OsRng;
2118
use tokio::{

manul/Cargo.toml

+4-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ rand_core = { version = "0.6.4", default-features = false }
2020
tracing = { version = "0.1", default-features = false }
2121
displaydoc = { version = "0.2", default-features = false }
2222
rand = { version = "0.8", default-features = false, optional = true }
23+
serde-persistent-deserializer = { version = "0.2", optional = true }
2324
postcard = { version = "1", default-features = false, features = ["alloc"], optional = true }
2425

2526
[dev-dependencies]
@@ -28,9 +29,11 @@ rand = { version = "0.8", default-features = false }
2829
serde_asn1_der = "0.8"
2930
serde_json = "1"
3031
criterion = "0.5"
32+
serde-persistent-deserializer = "0.2"
33+
postcard = { version = "1", default-features = false, features = ["alloc"] }
3134

3235
[features]
33-
testing = ["rand", "postcard"]
36+
testing = ["rand", "postcard", "serde-persistent-deserializer"]
3437

3538
[package.metadata.docs.rs]
3639
all-features = true

manul/src/session/evidence.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use super::{
88
message::{MessageVerificationError, MissingMessage, SignedMessage},
99
session::SessionParameters,
1010
transcript::Transcript,
11-
wire_format::{Deserializer, WireFormat},
11+
wire_format::Deserializer,
1212
LocalError,
1313
};
1414
use crate::{
@@ -233,10 +233,7 @@ where
233233
&self.description
234234
}
235235

236-
pub fn verify(&self, party: &SP::Verifier) -> Result<(), EvidenceError>
237-
where
238-
for<'a, 'de> &'a mut <<SP as SessionParameters>::WireFormat as WireFormat>::Des<'de>: serde::Deserializer<'de>,
239-
{
236+
pub fn verify(&self, party: &SP::Verifier) -> Result<(), EvidenceError> {
240237
let deserializer = Deserializer::new::<SP::WireFormat>();
241238
match &self.evidence {
242239
EvidenceEnum::Protocol(evidence) => evidence.verify::<SP>(party, &deserializer),

manul/src/session/session.rs

-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ where
148148
) -> Result<Self, LocalError>
149149
where
150150
R: FirstRound<SP::Verifier> + Round<SP::Verifier, Protocol = P>,
151-
for<'a, 'de> &'a mut <<SP as SessionParameters>::WireFormat as WireFormat>::Des<'de>: serde::Deserializer<'de>,
152151
{
153152
let verifier = signer.verifying_key();
154153
let first_round = Box::new(ObjectSafeRoundWrapper::new(R::new(

manul/src/session/wire_format.rs

+8-31
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,10 @@ pub trait WireFormat: 'static + Send + Sync + Debug {
1111
fn serialize<T: Serialize>(value: T) -> Result<Box<[u8]>, LocalError>;
1212

1313
/// The deserializer type.
14-
type Des<'de>: 'de;
14+
type Des<'de>: serde::Deserializer<'de>;
1515

1616
/// Creates a `serde` deserializer given a bytestring.
17-
fn deserializer<'de>(bytes: &'de [u8]) -> Self::Des<'de>
18-
where
19-
for<'a> &'a mut Self::Des<'de>: serde::Deserializer<'de>;
17+
fn deserializer(bytes: &[u8]) -> Self::Des<'_>;
2018
}
2119

2220
// Serialization
@@ -56,35 +54,16 @@ impl Serializer {
5654
struct DeserializerFactoryWrapper<F>(PhantomData<F>);
5755

5856
trait ObjectSafeDeserializerFactory: Debug {
59-
fn make_deserializer<'de>(&self, bytes: &'de [u8]) -> Box<dyn ObjectSafeDeserializer<'de> + 'de>;
57+
fn make_erased_deserializer<'de>(&self, bytes: &'de [u8]) -> Box<dyn erased_serde::Deserializer<'de> + 'de>;
6058
}
6159

6260
impl<F> ObjectSafeDeserializerFactory for DeserializerFactoryWrapper<F>
6361
where
6462
F: WireFormat,
65-
for<'a, 'de> &'a mut F::Des<'de>: serde::Deserializer<'de>,
6663
{
67-
fn make_deserializer<'de>(&self, bytes: &'de [u8]) -> Box<dyn ObjectSafeDeserializer<'de> + 'de> {
64+
fn make_erased_deserializer<'de>(&self, bytes: &'de [u8]) -> Box<dyn erased_serde::Deserializer<'de> + 'de> {
6865
let deserializer = F::deserializer(bytes);
69-
Box::new(deserializer)
70-
}
71-
}
72-
73-
trait ObjectSafeDeserializer<'de> {
74-
fn get_erased<'s>(&'s mut self) -> Box<dyn erased_serde::Deserializer<'de> + 's>
75-
where
76-
'de: 's;
77-
}
78-
79-
impl<'de, D: 'de> ObjectSafeDeserializer<'de> for D
80-
where
81-
for<'any> &'any mut D: serde::Deserializer<'de>,
82-
{
83-
fn get_erased<'s>(&'s mut self) -> Box<dyn erased_serde::Deserializer<'de> + 's>
84-
where
85-
'de: 's,
86-
{
87-
Box::new(<dyn erased_serde::Deserializer<'_>>::erase(self))
66+
Box::new(<dyn erased_serde::Deserializer<'_>>::erase(deserializer))
8867
}
8968
}
9069

@@ -96,19 +75,17 @@ impl Deserializer {
9675
pub(crate) fn new<F>() -> Self
9776
where
9877
F: WireFormat,
99-
for<'a, 'de> &'a mut F::Des<'de>: serde::Deserializer<'de>,
10078
{
101-
Self(Box::new(DeserializerFactoryWrapper(PhantomData)))
79+
Self(Box::new(DeserializerFactoryWrapper(PhantomData::<F>)))
10280
}
10381

10482
/// Deserializes a `serde`-deserializable object.
10583
pub fn deserialize<'de, T>(&self, bytes: &'de [u8]) -> Result<T, DeserializationError>
10684
where
10785
T: Deserialize<'de>,
10886
{
109-
let mut deserializer = self.0.make_deserializer(bytes);
110-
let mut erased = deserializer.get_erased();
111-
erased_serde::deserialize::<T>(&mut erased)
87+
let mut deserializer = self.0.make_erased_deserializer(bytes);
88+
erased_serde::deserialize::<T>(&mut deserializer)
11289
.map_err(|err| DeserializationError::new(format!("Deserialization error: {err:?}")))
11390
}
11491
}

manul/src/testing/format.rs

+22-6
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,42 @@
11
use alloc::{boxed::Box, string::ToString};
22

33
use serde::Serialize;
4+
use serde_persistent_deserializer::{AsTransientDeserializer, PersistentDeserializer};
45

56
use crate::{protocol::LocalError, session::WireFormat};
67

78
/// A binary format to use in tests.
89
#[derive(Debug, Clone, Copy)]
910
pub struct Binary;
1011

12+
#[allow(missing_debug_implementations)]
13+
pub struct PostcardDeserializer<'de>(postcard::Deserializer<'de, postcard::de_flavors::Slice<'de>>);
14+
15+
impl<'de> AsTransientDeserializer<'de> for PostcardDeserializer<'de> {
16+
type Error = postcard::Error;
17+
18+
fn as_transient_deserializer<'a>(&'a mut self) -> impl serde::Deserializer<'de, Error = Self::Error> {
19+
&mut self.0
20+
}
21+
22+
fn is_human_readable(&self) -> bool {
23+
false
24+
}
25+
}
26+
1127
impl WireFormat for Binary {
1228
fn serialize<T: Serialize>(value: T) -> Result<Box<[u8]>, LocalError> {
1329
postcard::to_allocvec(&value)
1430
.map(|vec| vec.into())
1531
.map_err(|err| LocalError::new(err.to_string()))
1632
}
1733

18-
type Des<'de> = postcard::Deserializer<'de, postcard::de_flavors::Slice<'de>>;
34+
type Des<'de> = PersistentDeserializer<PostcardDeserializer<'de>>;
1935

20-
fn deserializer<'de>(bytes: &'de [u8]) -> Self::Des<'de>
21-
where
22-
for<'a> &'a mut Self::Des<'de>: serde::Deserializer<'de>,
23-
{
24-
postcard::Deserializer::from_flavor(postcard::de_flavors::Slice::new(bytes))
36+
fn deserializer(bytes: &[u8]) -> Self::Des<'_> {
37+
let flavor = postcard::de_flavors::Slice::new(bytes);
38+
let deserializer = postcard::Deserializer::from_flavor(flavor);
39+
let persistent = PersistentDeserializer::new(PostcardDeserializer(deserializer));
40+
persistent
2541
}
2642
}

manul/src/testing/run_sync.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
protocol::{FirstRound, Protocol},
1212
session::{
1313
CanFinalize, LocalError, MessageBundle, RoundAccumulator, RoundOutcome, Session, SessionId, SessionParameters,
14-
SessionReport, WireFormat,
14+
SessionReport,
1515
},
1616
};
1717

@@ -98,7 +98,6 @@ pub fn run_sync<R, SP>(
9898
where
9999
R: 'static + FirstRound<SP::Verifier>,
100100
SP: 'static + SessionParameters + Debug,
101-
for<'a, 'de> &'a mut <<SP as SessionParameters>::WireFormat as WireFormat>::Des<'de>: serde::Deserializer<'de>,
102101
{
103102
let session_id = SessionId::random::<SP>(rng);
104103

0 commit comments

Comments
 (0)