Skip to content

Commit 6b74a6c

Browse files
committed
Simplify de-serialization
1 parent 119128e commit 6b74a6c

File tree

2 files changed

+36
-41
lines changed

2 files changed

+36
-41
lines changed

src/serialization.rs

+29-41
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ use core::ops::Add;
1313

1414
use digest::{BlockInput, Digest};
1515
use generic_array::sequence::Concat;
16-
use generic_array::typenum::{Sum, Unsigned};
16+
use generic_array::typenum::Sum;
1717
use generic_array::{ArrayLength, GenericArray};
1818

1919
use crate::errors::InternalError;
2020
use crate::group::Group;
21+
use crate::util::deserialize;
2122
use crate::voprf::{
2223
BlindedElement, EvaluationElement, NonVerifiableClient, NonVerifiableServer, Proof,
2324
VerifiableClient, VerifiableServer,
@@ -36,12 +37,9 @@ impl<G: Group, H: BlockInput + Digest> NonVerifiableClient<G, H> {
3637

3738
/// Deserialization from bytes
3839
pub fn deserialize(input: &[u8]) -> Result<Self, InternalError> {
39-
let scalar_len = G::ScalarLen::USIZE;
40-
if input.len() != scalar_len {
41-
return Err(InternalError::SizeError);
42-
}
40+
let mut input = input.iter().copied();
4341

44-
let blind = G::from_scalar_slice(&input[..scalar_len])?;
42+
let blind = G::from_scalar_slice(&deserialize(&mut input)?)?;
4543

4644
Ok(Self {
4745
blind,
@@ -62,14 +60,10 @@ impl<G: Group, H: BlockInput + Digest> VerifiableClient<G, H> {
6260

6361
/// Deserialization from bytes
6462
pub fn deserialize(input: &[u8]) -> Result<Self, InternalError> {
65-
let scalar_len = G::ScalarLen::USIZE;
66-
let elem_len = G::ElemLen::USIZE;
67-
if input.len() != scalar_len + elem_len {
68-
return Err(InternalError::SizeError);
69-
}
63+
let mut input = input.iter().copied();
7064

71-
let blind = G::from_scalar_slice(&input[..scalar_len])?;
72-
let blinded_element = G::from_element_slice(&input[scalar_len..scalar_len + elem_len])?;
65+
let blind = G::from_scalar_slice(&deserialize(&mut input)?)?;
66+
let blinded_element = G::from_element_slice(&deserialize(&mut input)?)?;
7367

7468
Ok(Self {
7569
blind,
@@ -87,12 +81,9 @@ impl<G: Group, H: BlockInput + Digest> NonVerifiableServer<G, H> {
8781

8882
/// Deserialization from bytes
8983
pub fn deserialize(input: &[u8]) -> Result<Self, InternalError> {
90-
let scalar_len = G::ScalarLen::USIZE;
91-
if input.len() != scalar_len {
92-
return Err(InternalError::SizeError);
93-
}
84+
let mut input = input.iter().copied();
9485

95-
let sk = G::from_scalar_slice(input)?;
86+
let sk = G::from_scalar_slice(&deserialize(&mut input)?)?;
9687

9788
Ok(Self {
9889
sk,
@@ -113,14 +104,10 @@ impl<G: Group, H: BlockInput + Digest> VerifiableServer<G, H> {
113104

114105
/// Deserialization from bytes
115106
pub fn deserialize(input: &[u8]) -> Result<Self, InternalError> {
116-
let scalar_len = G::ScalarLen::USIZE;
117-
let elem_len = G::ElemLen::USIZE;
118-
if input.len() != scalar_len + elem_len {
119-
return Err(InternalError::SizeError);
120-
}
107+
let mut input = input.iter().copied();
121108

122-
let sk = G::from_scalar_slice(&input[..scalar_len])?;
123-
let pk = G::from_element_slice(&input[scalar_len..])?;
109+
let sk = G::from_scalar_slice(&deserialize(&mut input)?)?;
110+
let pk = G::from_element_slice(&deserialize(&mut input)?)?;
124111

125112
Ok(Self {
126113
sk,
@@ -142,13 +129,14 @@ impl<G: Group, H: BlockInput + Digest> Proof<G, H> {
142129

143130
/// Deserialization from bytes
144131
pub fn deserialize(input: &[u8]) -> Result<Self, InternalError> {
145-
let scalar_len = G::ScalarLen::USIZE;
146-
if input.len() != scalar_len + scalar_len {
147-
return Err(InternalError::SizeError);
148-
}
132+
let mut input = input.iter().copied();
133+
134+
let c_scalar = G::from_scalar_slice(&deserialize(&mut input)?)?;
135+
let s_scalar = G::from_scalar_slice(&deserialize(&mut input)?)?;
136+
149137
Ok(Proof {
150-
c_scalar: G::from_scalar_slice(&input[..scalar_len])?,
151-
s_scalar: G::from_scalar_slice(&input[scalar_len..])?,
138+
c_scalar,
139+
s_scalar,
152140
hash: PhantomData,
153141
})
154142
}
@@ -162,12 +150,12 @@ impl<G: Group, H: BlockInput + Digest> BlindedElement<G, H> {
162150

163151
/// Deserialization from bytes
164152
pub fn deserialize(input: &[u8]) -> Result<Self, InternalError> {
165-
let elem_len = G::ElemLen::USIZE;
166-
if input.len() != elem_len {
167-
return Err(InternalError::SizeError);
168-
}
153+
let mut input = input.iter().copied();
154+
155+
let value = G::from_element_slice(&deserialize(&mut input)?)?;
156+
169157
Ok(Self {
170-
value: G::from_element_slice(input)?,
158+
value,
171159
hash: PhantomData,
172160
})
173161
}
@@ -181,12 +169,12 @@ impl<G: Group, H: BlockInput + Digest> EvaluationElement<G, H> {
181169

182170
/// Deserialization from bytes
183171
pub fn deserialize(input: &[u8]) -> Result<Self, InternalError> {
184-
let elem_len = G::ElemLen::USIZE;
185-
if input.len() != elem_len {
186-
return Err(InternalError::SizeError);
187-
}
172+
let mut input = input.iter().copied();
173+
174+
let value = G::from_element_slice(&deserialize(&mut input)?)?;
175+
188176
Ok(Self {
189-
value: G::from_element_slice(input)?,
177+
value,
190178
hash: PhantomData,
191179
})
192180
}

src/util.rs

+7
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ pub(crate) fn serialize_owned<L1: ArrayLength<u8>, L2: ArrayLength<u8>>(
8585
})
8686
}
8787

88+
pub(crate) fn deserialize<L: ArrayLength<u8>>(
89+
input: &mut impl Iterator<Item = u8>,
90+
) -> Result<GenericArray<u8, L>, InternalError> {
91+
let input = input.by_ref().take(L::USIZE);
92+
GenericArray::from_exact_iter(input).ok_or(InternalError::SizeError)
93+
}
94+
8895
macro_rules! chain_name {
8996
($var:ident, $mod:ident) => {
9097
$mod

0 commit comments

Comments
 (0)