From 598079c16bb77681df822e18270fd9be3e7468cf Mon Sep 17 00:00:00 2001 From: Raminder Singh Date: Sun, 2 Jul 2023 14:44:51 +0530 Subject: [PATCH 1/8] impl SerializeBytes for TlsByteVecUX types --- tls_codec/src/tls_vec.rs | 58 +++++++++++++++++++++++++++++++-- tls_codec/tests/encode_bytes.rs | 29 ++++++++++++++++- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/tls_codec/src/tls_vec.rs b/tls_codec/src/tls_vec.rs index da0c9f0a0..5432187cb 100644 --- a/tls_codec/src/tls_vec.rs +++ b/tls_codec/src/tls_vec.rs @@ -13,7 +13,7 @@ use serde::ser::SerializeStruct; use std::io::{Read, Write}; use zeroize::Zeroize; -use crate::{Deserialize, DeserializeBytes, Error, Serialize, Size}; +use crate::{Deserialize, DeserializeBytes, Error, Serialize, SerializeBytes, Size}; macro_rules! impl_size { ($self:ident, $size:ty, $name:ident, $len_len:literal) => { @@ -78,6 +78,46 @@ macro_rules! impl_byte_deserialize { let result = Self { vec: vec.to_vec() }; Ok((result, &remainder.get(len..).ok_or(Error::EndOfStream)?)) } + + fn serialize_bytes_bytes(&$self) -> Result, Error> { + let tls_serialized_len = $self.tls_serialized_len(); + let byte_length = tls_serialized_len - $len_len; + + let ll = $len_len; + std::println!("serialize_bytes_bytes: tls_serialized_len: {tls_serialized_len}, $len_len: {ll}, byte_length: {byte_length}"); + + let max_len = <$size>::MAX as usize; + debug_assert!( + byte_length <= max_len, + "Vector length can't be encoded in the vector length a {} >= {}", + byte_length, + max_len + ); + if byte_length > max_len { + return Err(Error::InvalidVectorLength); + } + + let mut vec = Vec::::with_capacity(tls_serialized_len); + let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), &mut vec)?; + + let bytes = $self.as_slice(); + vec.extend_from_slice(bytes); + written += bytes.len(); + + debug_assert_eq!( + written, tls_serialized_len, + "{} bytes should have been serialized but {} were written", + tls_serialized_len, written + ); + if written != tls_serialized_len { + return Err(Error::EncodingError(format!( + "{} bytes should have been serialized but {} were written", + tls_serialized_len, written + ))); + } + + Ok(vec) + } }; } @@ -130,6 +170,9 @@ macro_rules! impl_serialize { let tls_serialized_len = $self.tls_serialized_len(); let byte_length = tls_serialized_len - $len_len; + let ll = $len_len; + std::println!("serialize: tls_serialized_len: {tls_serialized_len}, $len_len: {ll}, byte_length: {byte_length}"); + let max_len = <$size>::MAX as usize; debug_assert!( byte_length <= max_len, @@ -141,7 +184,7 @@ macro_rules! impl_serialize { return Err(Error::InvalidVectorLength); } - let mut written = (byte_length as $size).tls_serialize(writer)?; + let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), writer)?; // Now serialize the elements for e in $self.as_slice().iter() { @@ -174,6 +217,9 @@ macro_rules! impl_byte_serialize { let tls_serialized_len = $self.tls_serialized_len(); let byte_length = tls_serialized_len - $len_len; + let ll = $len_len; + std::println!("serialize_bytes: tls_serialized_len: {tls_serialized_len}, $len_len: {ll}, byte_length: {byte_length}"); + let max_len = <$size>::MAX as usize; debug_assert!( byte_length <= max_len, @@ -185,7 +231,7 @@ macro_rules! impl_byte_serialize { return Err(Error::InvalidVectorLength); } - let mut written = (byte_length as $size).tls_serialize(writer)?; + let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), writer)?; // Now serialize the elements written += writer.write($self.as_slice())?; @@ -293,6 +339,12 @@ macro_rules! impl_tls_vec_codec_bytes { Self::deserialize_bytes_bytes(bytes) } } + + impl SerializeBytes for $name { + fn tls_serialize(&self) -> Result, Error> { + self.serialize_bytes_bytes() + } + } }; } diff --git a/tls_codec/tests/encode_bytes.rs b/tls_codec/tests/encode_bytes.rs index 20830b5e0..f9b30224b 100644 --- a/tls_codec/tests/encode_bytes.rs +++ b/tls_codec/tests/encode_bytes.rs @@ -1,4 +1,4 @@ -use tls_codec::SerializeBytes; +use tls_codec::{SerializeBytes, TlsByteVecU16, TlsByteVecU32, TlsByteVecU8}; #[test] fn serialize_primitives() { @@ -40,3 +40,30 @@ fn serialize_var_len_boundaries() { let serialized = v.tls_serialize().expect("Error encoding vector"); assert_eq!(&serialized[0..5], &[0x80, 0, 0x40, 0, 99]); } + +#[test] +fn serialize_tls_byte_vec_u8() { + let byte_vec = TlsByteVecU8::from_slice(&[1, 2, 3]); + let actual_result = byte_vec + .tls_serialize() + .expect("Error encoding byte vector"); + assert_eq!(actual_result, vec![3, 1, 2, 3]); +} + +#[test] +fn serialize_tls_byte_vec_u16() { + let byte_vec = TlsByteVecU16::from_slice(&[1, 2, 3]); + let actual_result = byte_vec + .tls_serialize() + .expect("Error encoding byte vector"); + assert_eq!(actual_result, vec![0, 3, 1, 2, 3]); +} + +#[test] +fn serialize_tls_byte_vec_u32() { + let byte_vec = TlsByteVecU32::from_slice(&[1, 2, 3]); + let actual_result = byte_vec + .tls_serialize() + .expect("Error encoding byte vector"); + assert_eq!(actual_result, vec![0, 0, 0, 3, 1, 2, 3]); +} From 51297a894a0013e3dc19f8cacaeea65772fe19d3 Mon Sep 17 00:00:00 2001 From: Raminder Singh Date: Sun, 2 Jul 2023 15:29:33 +0530 Subject: [PATCH 2/8] remove println statments --- tls_codec/src/tls_vec.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tls_codec/src/tls_vec.rs b/tls_codec/src/tls_vec.rs index 5432187cb..3d123e161 100644 --- a/tls_codec/src/tls_vec.rs +++ b/tls_codec/src/tls_vec.rs @@ -83,9 +83,6 @@ macro_rules! impl_byte_deserialize { let tls_serialized_len = $self.tls_serialized_len(); let byte_length = tls_serialized_len - $len_len; - let ll = $len_len; - std::println!("serialize_bytes_bytes: tls_serialized_len: {tls_serialized_len}, $len_len: {ll}, byte_length: {byte_length}"); - let max_len = <$size>::MAX as usize; debug_assert!( byte_length <= max_len, @@ -170,9 +167,6 @@ macro_rules! impl_serialize { let tls_serialized_len = $self.tls_serialized_len(); let byte_length = tls_serialized_len - $len_len; - let ll = $len_len; - std::println!("serialize: tls_serialized_len: {tls_serialized_len}, $len_len: {ll}, byte_length: {byte_length}"); - let max_len = <$size>::MAX as usize; debug_assert!( byte_length <= max_len, @@ -217,9 +211,6 @@ macro_rules! impl_byte_serialize { let tls_serialized_len = $self.tls_serialized_len(); let byte_length = tls_serialized_len - $len_len; - let ll = $len_len; - std::println!("serialize_bytes: tls_serialized_len: {tls_serialized_len}, $len_len: {ll}, byte_length: {byte_length}"); - let max_len = <$size>::MAX as usize; debug_assert!( byte_length <= max_len, From 10398c775208f8fc9f6f52df15b59e54112aa2c1 Mon Sep 17 00:00:00 2001 From: Raminder Singh Date: Sun, 2 Jul 2023 16:11:58 +0530 Subject: [PATCH 3/8] use fully qualified name for Serialize trait --- tls_codec/src/tls_vec.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tls_codec/src/tls_vec.rs b/tls_codec/src/tls_vec.rs index 3d123e161..e0935d8dd 100644 --- a/tls_codec/src/tls_vec.rs +++ b/tls_codec/src/tls_vec.rs @@ -95,7 +95,7 @@ macro_rules! impl_byte_deserialize { } let mut vec = Vec::::with_capacity(tls_serialized_len); - let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), &mut vec)?; + let mut written = <$size as $crate::Serialize>::tls_serialize(&(byte_length as $size), &mut vec)?; let bytes = $self.as_slice(); vec.extend_from_slice(bytes); @@ -178,7 +178,7 @@ macro_rules! impl_serialize { return Err(Error::InvalidVectorLength); } - let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), writer)?; + let mut written = <$size as $crate::Serialize>::tls_serialize(&(byte_length as $size), writer)?; // Now serialize the elements for e in $self.as_slice().iter() { @@ -222,7 +222,7 @@ macro_rules! impl_byte_serialize { return Err(Error::InvalidVectorLength); } - let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), writer)?; + let mut written = <$size as $crate::Serialize>::tls_serialize(&(byte_length as $size), writer)?; // Now serialize the elements written += writer.write($self.as_slice())?; From 14ce591b1b3408fa8d06acae4b5b662b1ecdc0ab Mon Sep 17 00:00:00 2001 From: Raminder Singh Date: Sun, 2 Jul 2023 16:41:19 +0530 Subject: [PATCH 4/8] Revert "use fully qualified name for Serialize trait" This reverts commit 73e6f26f66b8d404dd0c4587999e3e39a71ac040. --- tls_codec/src/tls_vec.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tls_codec/src/tls_vec.rs b/tls_codec/src/tls_vec.rs index e0935d8dd..3d123e161 100644 --- a/tls_codec/src/tls_vec.rs +++ b/tls_codec/src/tls_vec.rs @@ -95,7 +95,7 @@ macro_rules! impl_byte_deserialize { } let mut vec = Vec::::with_capacity(tls_serialized_len); - let mut written = <$size as $crate::Serialize>::tls_serialize(&(byte_length as $size), &mut vec)?; + let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), &mut vec)?; let bytes = $self.as_slice(); vec.extend_from_slice(bytes); @@ -178,7 +178,7 @@ macro_rules! impl_serialize { return Err(Error::InvalidVectorLength); } - let mut written = <$size as $crate::Serialize>::tls_serialize(&(byte_length as $size), writer)?; + let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), writer)?; // Now serialize the elements for e in $self.as_slice().iter() { @@ -222,7 +222,7 @@ macro_rules! impl_byte_serialize { return Err(Error::InvalidVectorLength); } - let mut written = <$size as $crate::Serialize>::tls_serialize(&(byte_length as $size), writer)?; + let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), writer)?; // Now serialize the elements written += writer.write($self.as_slice())?; From 0c23e290ec33796017a724175f66e3f52e7a777a Mon Sep 17 00:00:00 2001 From: Raminder Singh Date: Sun, 2 Jul 2023 16:44:21 +0530 Subject: [PATCH 5/8] do not use Serialize trait in impl of SerializeBytes --- tls_codec/src/tls_vec.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tls_codec/src/tls_vec.rs b/tls_codec/src/tls_vec.rs index 3d123e161..f1ddc2eb3 100644 --- a/tls_codec/src/tls_vec.rs +++ b/tls_codec/src/tls_vec.rs @@ -95,7 +95,9 @@ macro_rules! impl_byte_deserialize { } let mut vec = Vec::::with_capacity(tls_serialized_len); - let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), &mut vec)?; + let length_vec = <$size as SerializeBytes>::tls_serialize(&(byte_length as $size))?; + let mut written = length_vec.len(); + vec.extend_from_slice(&length_vec); let bytes = $self.as_slice(); vec.extend_from_slice(bytes); From 5bea0d9c7d9198f39d51a630856406d80bbcf85f Mon Sep 17 00:00:00 2001 From: Raminder Singh Date: Tue, 4 Jul 2023 16:01:16 +0530 Subject: [PATCH 6/8] remove duplicate code --- tls_codec/src/tls_vec.rs | 119 ++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 69 deletions(-) diff --git a/tls_codec/src/tls_vec.rs b/tls_codec/src/tls_vec.rs index f1ddc2eb3..37bbb1a2f 100644 --- a/tls_codec/src/tls_vec.rs +++ b/tls_codec/src/tls_vec.rs @@ -78,45 +78,6 @@ macro_rules! impl_byte_deserialize { let result = Self { vec: vec.to_vec() }; Ok((result, &remainder.get(len..).ok_or(Error::EndOfStream)?)) } - - fn serialize_bytes_bytes(&$self) -> Result, Error> { - let tls_serialized_len = $self.tls_serialized_len(); - let byte_length = tls_serialized_len - $len_len; - - let max_len = <$size>::MAX as usize; - debug_assert!( - byte_length <= max_len, - "Vector length can't be encoded in the vector length a {} >= {}", - byte_length, - max_len - ); - if byte_length > max_len { - return Err(Error::InvalidVectorLength); - } - - let mut vec = Vec::::with_capacity(tls_serialized_len); - let length_vec = <$size as SerializeBytes>::tls_serialize(&(byte_length as $size))?; - let mut written = length_vec.len(); - vec.extend_from_slice(&length_vec); - - let bytes = $self.as_slice(); - vec.extend_from_slice(bytes); - written += bytes.len(); - - debug_assert_eq!( - written, tls_serialized_len, - "{} bytes should have been serialized but {} were written", - tls_serialized_len, written - ); - if written != tls_serialized_len { - return Err(Error::EncodingError(format!( - "{} bytes should have been serialized but {} were written", - tls_serialized_len, written - ))); - } - - Ok(vec) - } }; } @@ -166,19 +127,7 @@ macro_rules! impl_serialize { fn serialize(&$self, writer: &mut W) -> Result { // Get the byte length of the content, make sure it's not too // large and write it out. - let tls_serialized_len = $self.tls_serialized_len(); - let byte_length = tls_serialized_len - $len_len; - - let max_len = <$size>::MAX as usize; - debug_assert!( - byte_length <= max_len, - "Vector length can't be encoded in the vector length a {} >= {}", - byte_length, - max_len - ); - if byte_length > max_len { - return Err(Error::InvalidVectorLength); - } + let (tls_serialized_len, byte_length) = $self.get_content_lengths()?; let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), writer)?; @@ -187,17 +136,7 @@ macro_rules! impl_serialize { written += e.tls_serialize(writer)?; } - debug_assert_eq!( - written, tls_serialized_len, - "{} bytes should have been serialized but {} were written", - tls_serialized_len, written - ); - if written != tls_serialized_len { - return Err(Error::EncodingError(format!( - "{} bytes should have been serialized but {} were written", - tls_serialized_len, written - ))); - } + $self.assert_written_bytes(tls_serialized_len, written)?; Ok(written) } }; @@ -210,6 +149,22 @@ macro_rules! impl_byte_serialize { fn serialize_bytes(&$self, writer: &mut W) -> Result { // Get the byte length of the content, make sure it's not too // large and write it out. + let (tls_serialized_len, byte_length) = $self.get_content_lengths()?; + + let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), writer)?; + + // Now serialize the elements + written += writer.write($self.as_slice())?; + + $self.assert_written_bytes(tls_serialized_len, written)?; + Ok(written) + } + }; +} +macro_rules! impl_serialize_common { + ($self:ident, $size:ty, $name:ident, $len_len:literal $(,#[$attr:meta])?) => { + $(#[$attr])? + fn get_content_lengths(&$self) -> Result<(usize, usize), Error> { let tls_serialized_len = $self.tls_serialized_len(); let byte_length = tls_serialized_len - $len_len; @@ -223,12 +178,11 @@ macro_rules! impl_byte_serialize { if byte_length > max_len { return Err(Error::InvalidVectorLength); } + Ok((tls_serialized_len, byte_length)) + } - let mut written = <$size as Serialize>::tls_serialize(&(byte_length as $size), writer)?; - - // Now serialize the elements - written += writer.write($self.as_slice())?; - + $(#[$attr])? + fn assert_written_bytes(&$self, tls_serialized_len: usize, written: usize) -> Result<(), Error> { debug_assert_eq!( written, tls_serialized_len, "{} bytes should have been serialized but {} were written", @@ -240,7 +194,28 @@ macro_rules! impl_byte_serialize { tls_serialized_len, written ))); } - Ok(written) + Ok(()) + } + }; +} + +macro_rules! impl_serialize_bytes_bytes { + ($self:ident, $size:ty, $name:ident, $len_len:literal) => { + fn serialize_bytes_bytes(&$self) -> Result, Error> { + let (tls_serialized_len, byte_length) = $self.get_content_lengths()?; + + let mut vec = Vec::::with_capacity(tls_serialized_len); + let length_vec = <$size as SerializeBytes>::tls_serialize(&(byte_length as $size))?; + let mut written = length_vec.len(); + vec.extend_from_slice(&length_vec); + + let bytes = $self.as_slice(); + vec.extend_from_slice(bytes); + written += bytes.len(); + + $self.assert_written_bytes(tls_serialized_len, written)?; + + Ok(vec) } }; } @@ -834,6 +809,7 @@ macro_rules! impl_secret_tls_vec { impl_tls_vec_codec_generic!($size, $name, $len_len, Zeroize); impl $name { + impl_serialize_common!(self, $size, $name, $len_len, #[cfg(feature = "std")]); impl_serialize!(self, $size, $name, $len_len); } @@ -870,6 +846,7 @@ macro_rules! impl_public_tls_vec { impl_tls_vec_codec_generic!($size, $name, $len_len); impl $name { + impl_serialize_common!(self, $size, $name, $len_len, #[cfg(feature = "std")]); impl_serialize!(self, $size, $name, $len_len); } @@ -893,7 +870,9 @@ macro_rules! impl_tls_byte_vec { impl $name { // This implements serialize and size for all versions + impl_serialize_common!(self, $size, $name, $len_len); impl_byte_serialize!(self, $size, $name, $len_len); + impl_serialize_bytes_bytes!(self, $size, $name, $len_len); impl_byte_size!(self, $size, $name, $len_len); impl_byte_deserialize!(self, $size, $name, $len_len); } @@ -930,6 +909,7 @@ macro_rules! impl_tls_byte_slice { } impl<'a> $name<'a> { + impl_serialize_common!(self, $size, $name, $len_len, #[cfg(feature = "std")]); impl_byte_serialize!(self, $size, $name, $len_len); impl_byte_size!(self, $size, $name, $len_len); } @@ -985,6 +965,7 @@ macro_rules! impl_tls_slice { } impl<'a, T: Serialize> $name<'a, T> { + impl_serialize_common!(self, $size, $name, $len_len, #[cfg(feature = "std")]); impl_serialize!(self, $size, $name, $len_len); } From a8cd76e4ecc203f176af0acbeca490f560a67352 Mon Sep 17 00:00:00 2001 From: Raminder Singh Date: Tue, 4 Jul 2023 16:05:52 +0530 Subject: [PATCH 7/8] rename meta-variable --- tls_codec/src/tls_vec.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tls_codec/src/tls_vec.rs b/tls_codec/src/tls_vec.rs index 37bbb1a2f..c9a989a9e 100644 --- a/tls_codec/src/tls_vec.rs +++ b/tls_codec/src/tls_vec.rs @@ -162,8 +162,8 @@ macro_rules! impl_byte_serialize { }; } macro_rules! impl_serialize_common { - ($self:ident, $size:ty, $name:ident, $len_len:literal $(,#[$attr:meta])?) => { - $(#[$attr])? + ($self:ident, $size:ty, $name:ident, $len_len:literal $(,#[$std_enabled:meta])?) => { + $(#[$std_enabled])? fn get_content_lengths(&$self) -> Result<(usize, usize), Error> { let tls_serialized_len = $self.tls_serialized_len(); let byte_length = tls_serialized_len - $len_len; @@ -181,7 +181,7 @@ macro_rules! impl_serialize_common { Ok((tls_serialized_len, byte_length)) } - $(#[$attr])? + $(#[$std_enabled])? fn assert_written_bytes(&$self, tls_serialized_len: usize, written: usize) -> Result<(), Error> { debug_assert_eq!( written, tls_serialized_len, From 88789349e4c4eac38a5a01f922086215dddde4b3 Mon Sep 17 00:00:00 2001 From: Raminder Singh Date: Fri, 21 Jul 2023 12:10:27 +0530 Subject: [PATCH 8/8] Fix formatting Co-authored-by: Franziskus Kiefer --- tls_codec/src/tls_vec.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tls_codec/src/tls_vec.rs b/tls_codec/src/tls_vec.rs index c9a989a9e..6540eafbf 100644 --- a/tls_codec/src/tls_vec.rs +++ b/tls_codec/src/tls_vec.rs @@ -161,6 +161,7 @@ macro_rules! impl_byte_serialize { } }; } + macro_rules! impl_serialize_common { ($self:ident, $size:ty, $name:ident, $len_len:literal $(,#[$std_enabled:meta])?) => { $(#[$std_enabled])?