Skip to content

Commit 049a23f

Browse files
committed
implement different serializers
This commit reviews the serialization approach from the ground to allow using different serializers and deserializers. For instance, this allows avoiding a copy after calling `.serialize()`: in the previous version, `serialize()` was always returning a `Zeroizing<Vec<u8>>`; in this new version, `serialize` takes an additional type parameter specifying which `Serializer` to use and returns `Serializer::Output`. Two serializers are implemented: - `SecretSerializer` which returns a `Zeroizing<Vec<u8>>`; calling `.serialize<SecretSerializer>()` is therefore equivalent to the previous `.serialze()` call. - `PublicSerializer` which returns a `Vec<u8>` and is therefore appropriate to for use in deserialization of values that do not need to be zeroized on drop.
1 parent c259ccc commit 049a23f

8 files changed

Lines changed: 339 additions & 556 deletions

File tree

src/asymmetric_crypto/curves/curve_25519/curve_secret.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,17 @@ impl SecretCBytes<{ CURVE_25519_SECRET_LENGTH }> for Curve25519Secret {}
4141
/// Key Serialization framework
4242
#[cfg(feature = "ser")]
4343
impl Serializable for Curve25519Secret {
44-
type Error = CryptoCoreError;
45-
4644
fn length(&self) -> usize {
4745
Self::LENGTH
4846
}
4947

50-
fn write(&self, ser: &mut Serializer) -> Result<usize, Self::Error> {
51-
ser.write_array(self.as_bytes())
48+
fn write<S: Serializer>(&self, ser: &mut S) -> Result<usize, S::Error> {
49+
ser.write_bytes(self.as_bytes())
5250
}
5351

54-
fn read(de: &mut Deserializer) -> Result<Self, Self::Error> {
55-
let bytes = de.read_array::<{ Self::LENGTH }>()?;
56-
Self::try_from_bytes(bytes)
52+
fn read<D: Deserializer>(de: &mut D) -> Result<Self, D::Error> {
53+
let bytes = <[u8; Self::LENGTH]>::read(de)?;
54+
Self::try_from_bytes(bytes).map_err(D::Error::from)
5755
}
5856
}
5957

src/asymmetric_crypto/curves/curve_25519/ristretto_25519/curve_point.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,16 @@ impl From<&R25519PrivateKey> for R25519CurvePoint {
5151

5252
#[cfg(feature = "ser")]
5353
impl Serializable for R25519CurvePoint {
54-
type Error = CryptoCoreError;
55-
5654
fn length(&self) -> usize {
5755
Self::LENGTH
5856
}
5957

60-
fn write(&self, ser: &mut crate::bytes_ser_de::Serializer) -> Result<usize, Self::Error> {
61-
ser.write_array(&self.0.compress().to_bytes())
58+
fn write<S: crate::bytes_ser_de::Serializer>(&self, ser: &mut S) -> Result<usize, S::Error> {
59+
self.0.compress().to_bytes().write(ser)
6260
}
6361

64-
fn read(de: &mut crate::bytes_ser_de::Deserializer) -> Result<Self, Self::Error> {
65-
Self::try_from_bytes(de.read_array::<{ Self::LENGTH }>()?)
62+
fn read<D: crate::bytes_ser_de::Deserializer>(de: &mut D) -> Result<Self, D::Error> {
63+
Self::try_from_bytes(<[u8; Self::LENGTH]>::read(de)?).map_err(D::Error::from)
6664
}
6765
}
6866

src/asymmetric_crypto/curves/curve_25519/ristretto_25519/private_key.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,17 @@ impl SecretCBytes<{ R25519_PRIVATE_KEY_LENGTH }> for R25519PrivateKey {}
5151
/// Key Serialization framework
5252
#[cfg(feature = "ser")]
5353
impl Serializable for R25519PrivateKey {
54-
type Error = CryptoCoreError;
55-
5654
fn length(&self) -> usize {
5755
Self::LENGTH
5856
}
5957

60-
fn write(&self, ser: &mut Serializer) -> Result<usize, Self::Error> {
61-
ser.write_array(self.as_bytes())
58+
fn write<S: Serializer>(&self, ser: &mut S) -> Result<usize, S::Error> {
59+
ser.write_bytes(self.as_bytes())
6260
}
6361

64-
fn read(de: &mut Deserializer) -> Result<Self, Self::Error> {
65-
let bytes = de.read_array::<{ Self::LENGTH }>()?;
66-
Self::try_from_bytes(bytes)
62+
fn read<D: Deserializer>(de: &mut D) -> Result<Self, D::Error> {
63+
let bytes = <[u8; Self::LENGTH]>::read(de)?;
64+
Self::try_from_bytes(bytes).map_err(D::Error::from)
6765
}
6866
}
6967

src/asymmetric_crypto/curves/nist/private_key.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -150,19 +150,17 @@ impl<C: Curve + CurveArithmetic, const LENGTH: usize> crate::PrivateKey
150150
/// Key Serialization framework
151151
#[cfg(all(feature = "ser", feature = "aes"))]
152152
impl<C: Curve + CurveArithmetic, const LENGTH: usize> Serializable for NistPrivateKey<C, LENGTH> {
153-
type Error = CryptoCoreError;
154-
155153
fn length(&self) -> usize {
156154
LENGTH
157155
}
158156

159-
fn write(&self, ser: &mut Serializer) -> Result<usize, Self::Error> {
160-
ser.write_array(self.as_bytes())
157+
fn write<S: Serializer>(&self, ser: &mut S) -> Result<usize, S::Error> {
158+
ser.write_bytes(self.as_bytes())
161159
}
162160

163-
fn read(de: &mut Deserializer) -> Result<Self, Self::Error> {
164-
let bytes = de.read_array::<LENGTH>()?;
165-
Self::try_from_bytes(bytes)
161+
fn read<D: Deserializer>(de: &mut D) -> Result<Self, D::Error> {
162+
let bytes = <[u8; LENGTH]>::read(de)?;
163+
Self::try_from_bytes(bytes).map_err(D::Error::from)
166164
}
167165
}
168166

src/asymmetric_crypto/curves/nist/public_key.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,19 +149,17 @@ where
149149
<C as CurveArithmetic>::AffinePoint: sec1::ToEncodedPoint<C>,
150150
<C as CurveArithmetic>::AffinePoint: sec1::FromEncodedPoint<C>,
151151
{
152-
type Error = CryptoCoreError;
153-
154152
fn length(&self) -> usize {
155153
LENGTH
156154
}
157155

158-
fn write(&self, ser: &mut Serializer) -> Result<usize, Self::Error> {
159-
ser.write_array(self.to_bytes().as_ref())
156+
fn write<S: Serializer>(&self, ser: &mut S) -> Result<usize, S::Error> {
157+
self.to_bytes().write(ser)
160158
}
161159

162-
fn read(de: &mut Deserializer) -> Result<Self, Self::Error> {
163-
let bytes = de.read_array::<LENGTH>()?;
164-
Self::try_from_bytes(bytes)
160+
fn read<D: Deserializer>(de: &mut D) -> Result<Self, D::Error> {
161+
let bytes = <[u8; LENGTH]>::read(de)?;
162+
Self::try_from_bytes(bytes).map_err(D::Error::from)
165163
}
166164
}
167165

src/bytes.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@ macro_rules! _define_byte_type {
2929

3030
use std::ops::{Deref, DerefMut};
3131

32-
use $crate::{
33-
bytes_ser_de::Serializable, reexport::rand_core::RngCore, CryptoCoreError, Sampling,
34-
};
32+
use $crate::{bytes_ser_de::Serializable, reexport::rand_core::RngCore, Sampling};
3533

3634
impl<const LENGTH: usize> Deref for $name<LENGTH> {
3735
type Target = [u8; LENGTH];
@@ -84,21 +82,21 @@ macro_rules! _define_byte_type {
8482
}
8583

8684
impl<const LENGTH: usize> Serializable for $name<LENGTH> {
87-
type Error = CryptoCoreError;
88-
8985
fn length(&self) -> usize {
9086
LENGTH
9187
}
9288

93-
fn write(
89+
fn write<S: $crate::bytes_ser_de::Serializer>(
9490
&self,
95-
ser: &mut $crate::bytes_ser_de::Serializer,
96-
) -> Result<usize, Self::Error> {
97-
ser.write_array(&self.0)
91+
ser: &mut S,
92+
) -> Result<usize, S::Error> {
93+
ser.write_bytes(&self.0)
9894
}
9995

100-
fn read(de: &mut $crate::bytes_ser_de::Deserializer) -> Result<Self, Self::Error> {
101-
de.read_array::<LENGTH>().map(Self)
96+
fn read<D: $crate::bytes_ser_de::Deserializer>(
97+
de: &mut D,
98+
) -> Result<Self, D::Error> {
99+
<[u8; LENGTH]>::read(de).map(Self)
102100
}
103101
}
104102
}

0 commit comments

Comments
 (0)