diff --git a/generic-ec/CHANGELOG.md b/generic-ec/CHANGELOG.md index 5cfcec0..de79160 100644 --- a/generic-ec/CHANGELOG.md +++ b/generic-ec/CHANGELOG.md @@ -1,3 +1,6 @@ +## v0.4.3 +* Add `Point::serialized_len` + ## v0.4.2 * Update links, add info about our discord [#44] diff --git a/generic-ec/Cargo.toml b/generic-ec/Cargo.toml index 05ac6bb..6efb63e 100644 --- a/generic-ec/Cargo.toml +++ b/generic-ec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "generic-ec" -version = "0.4.2" +version = "0.4.3" edition = "2021" license = "MIT OR Apache-2.0" repository = "https://github.com/LFDT-Lockness/generic-ec" diff --git a/generic-ec/src/point/mod.rs b/generic-ec/src/point/mod.rs index de6ed54..1963444 100644 --- a/generic-ec/src/point/mod.rs +++ b/generic-ec/src/point/mod.rs @@ -97,6 +97,19 @@ impl Point { .and_then(Self::try_from_raw) .ok_or(InvalidPoint) } + + /// Returns size of bytes buffer that can fit a serialized point + /// + /// `compressed` parameter has the same meaning as for [`Point::to_bytes`]; a + /// buffer created with length of `Point::serialized_len(compress)` would fit + /// exactly the serialization `p.to_bytes(compress)`. + pub fn serialized_len(compressed: bool) -> usize { + if compressed { + E::CompressedPointArray::zeroes().as_ref().len() + } else { + E::UncompressedPointArray::zeroes().as_ref().len() + } + } } impl TryFromRaw for Point { diff --git a/tests/tests/curves.rs b/tests/tests/curves.rs index b3a08e5..4af1888 100644 --- a/tests/tests/curves.rs +++ b/tests/tests/curves.rs @@ -110,6 +110,8 @@ mod tests { let bytes_compressed = point.to_bytes(true); let bytes_uncompressed = point.to_bytes(false); assert!(bytes_compressed.len() <= bytes_uncompressed.len()); + assert_eq!(bytes_compressed.len(), Point::::serialized_len(true)); + assert_eq!(bytes_uncompressed.len(), Point::::serialized_len(false)); let p1 = Point::::from_bytes(&bytes_compressed).unwrap(); let p2 = Point::::from_bytes(&bytes_uncompressed).unwrap();