11//! Implements the `Serializer` and `Deserializer` objects using LEB128.
22
33use std:: {
4+ collections:: { HashMap , HashSet , LinkedList } ,
45 fmt:: Debug ,
6+ hash:: Hash ,
57 io:: { Read , Write } ,
68} ;
79
@@ -258,10 +260,6 @@ impl Default for Serializer {
258260/// → 0xE5 0x8E 0x26 Output stream (LSB to MSB)
259261///
260262/// Source: [Wikipedia](https://en.wikipedia.org/wiki/LEB128#Encoding_format)
261- ///
262- /// # Parameters
263- ///
264- /// - `n` : `usize` for which to compute the length of the serialization
265263#[ must_use]
266264pub fn to_leb128_len ( n : usize ) -> usize {
267265 let mut n = n >> 7 ;
@@ -273,6 +271,220 @@ pub fn to_leb128_len(n: usize) -> usize {
273271 size
274272}
275273
274+ impl Serializable for bool {
275+ type Error = CryptoCoreError ;
276+
277+ fn length ( & self ) -> usize {
278+ 1
279+ }
280+
281+ fn write ( & self , ser : & mut Serializer ) -> Result < usize , Self :: Error > {
282+ ser. write_leb128_u64 ( * self as u64 )
283+ }
284+
285+ fn read ( de : & mut Deserializer ) -> Result < Self , Self :: Error > {
286+ let b = de. read_leb128_u64 ( ) ?;
287+ match b {
288+ 0 => Ok ( false ) ,
289+ 1 => Ok ( true ) ,
290+ _ => Err ( CryptoCoreError :: GenericDeserializationError ( format ! (
291+ "not a valid boolean value serialization {b}"
292+ ) ) ) ,
293+ }
294+ }
295+ }
296+
297+ impl Serializable for u64 {
298+ type Error = CryptoCoreError ;
299+
300+ fn length ( & self ) -> usize {
301+ if * self == 0 {
302+ 1
303+ } else {
304+ ( 64 - self . leading_zeros ( ) ) . div_ceil ( 7 ) as usize
305+ }
306+ }
307+
308+ fn write ( & self , ser : & mut Serializer ) -> Result < usize , Self :: Error > {
309+ ser. write_leb128_u64 ( * self )
310+ }
311+
312+ fn read ( de : & mut Deserializer ) -> Result < Self , Self :: Error > {
313+ de. read_leb128_u64 ( )
314+ }
315+ }
316+
317+ impl Serializable for usize {
318+ type Error = CryptoCoreError ;
319+
320+ fn length ( & self ) -> usize {
321+ to_leb128_len ( * self )
322+ }
323+
324+ fn write ( & self , ser : & mut Serializer ) -> Result < usize , Self :: Error > {
325+ ser. write_leb128_u64 ( * self as u64 )
326+ }
327+
328+ fn read ( de : & mut Deserializer ) -> Result < Self , Self :: Error > {
329+ de. read_leb128_u64 ( ) . and_then ( |n| {
330+ usize:: try_from ( n) . map_err ( |_| {
331+ CryptoCoreError :: GenericDeserializationError ( "not an usize number" . to_string ( ) )
332+ } )
333+ } )
334+ }
335+ }
336+
337+ impl Serializable for String {
338+ type Error = CryptoCoreError ;
339+
340+ fn length ( & self ) -> usize {
341+ self . len ( ) . length ( ) + self . len ( )
342+ }
343+
344+ fn write ( & self , ser : & mut Serializer ) -> Result < usize , Self :: Error > {
345+ ser. write_vec ( self . as_bytes ( ) )
346+ }
347+
348+ fn read ( de : & mut Deserializer ) -> Result < Self , Self :: Error > {
349+ de. read_vec ( ) . and_then ( |bytes| {
350+ String :: from_utf8 ( bytes)
351+ . map_err ( |e| CryptoCoreError :: GenericDeserializationError ( e. to_string ( ) ) )
352+ } )
353+ }
354+ }
355+
356+ impl < T : Serializable > Serializable for Option < T >
357+ where
358+ T :: Error : From < CryptoCoreError > ,
359+ {
360+ type Error = T :: Error ;
361+
362+ fn length ( & self ) -> usize {
363+ 1 + self . as_ref ( ) . map ( |t| t. length ( ) ) . unwrap_or_default ( )
364+ }
365+
366+ fn write ( & self , ser : & mut Serializer ) -> Result < usize , Self :: Error > {
367+ if let Some ( t) = self {
368+ let mut n = ser. write ( & true ) ?;
369+ n += ser. write ( t) ?;
370+ Ok ( n)
371+ } else {
372+ ser. write ( & false ) . map_err ( Self :: Error :: from)
373+ }
374+ }
375+
376+ fn read ( de : & mut Deserializer ) -> Result < Self , Self :: Error > {
377+ let is_some = de. read :: < bool > ( ) ?;
378+ if is_some {
379+ de. read ( ) . map ( Some )
380+ } else {
381+ Ok ( None )
382+ }
383+ }
384+ }
385+
386+ impl < T : Serializable > Serializable for Vec < T >
387+ where
388+ T :: Error : From < CryptoCoreError > ,
389+ {
390+ type Error = T :: Error ;
391+
392+ fn length ( & self ) -> usize {
393+ self . len ( ) . length ( ) + self . iter ( ) . map ( Serializable :: length) . sum :: < usize > ( )
394+ }
395+
396+ fn write ( & self , ser : & mut Serializer ) -> Result < usize , Self :: Error > {
397+ self . iter ( )
398+ . try_fold ( ser. write ( & self . len ( ) ) ?, |n, t| Ok ( n + ser. write ( t) ?) )
399+ }
400+
401+ fn read ( de : & mut Deserializer ) -> Result < Self , Self :: Error > {
402+ let length = de. read :: < usize > ( ) ?;
403+ ( 0 ..length) . map ( |_| de. read :: < T > ( ) ) . collect ( )
404+ }
405+ }
406+
407+ impl < T : Serializable > Serializable for LinkedList < T >
408+ where
409+ T :: Error : From < CryptoCoreError > ,
410+ {
411+ type Error = T :: Error ;
412+
413+ fn length ( & self ) -> usize {
414+ self . len ( ) . length ( ) + self . iter ( ) . map ( Serializable :: length) . sum :: < usize > ( )
415+ }
416+
417+ fn write ( & self , ser : & mut Serializer ) -> Result < usize , Self :: Error > {
418+ self . iter ( )
419+ . try_fold ( ser. write ( & self . len ( ) ) ?, |n, t| Ok ( n + ser. write ( t) ?) )
420+ }
421+
422+ fn read ( de : & mut Deserializer ) -> Result < Self , Self :: Error > {
423+ let length = de. read :: < usize > ( ) ?;
424+ ( 0 ..length) . map ( |_| de. read :: < T > ( ) ) . collect ( )
425+ }
426+ }
427+
428+ impl < T : Hash + Eq + Serializable > Serializable for HashSet < T >
429+ where
430+ T :: Error : From < CryptoCoreError > ,
431+ {
432+ type Error = T :: Error ;
433+
434+ fn length ( & self ) -> usize {
435+ self . len ( ) . length ( ) + self . iter ( ) . map ( Serializable :: length) . sum :: < usize > ( )
436+ }
437+
438+ fn write ( & self , ser : & mut Serializer ) -> Result < usize , Self :: Error > {
439+ self . iter ( )
440+ . try_fold ( ser. write ( & self . len ( ) ) ?, |n, t| Ok ( n + ser. write ( t) ?) )
441+ }
442+
443+ fn read ( de : & mut Deserializer ) -> Result < Self , Self :: Error > {
444+ let length = de. read :: < usize > ( ) ?;
445+ ( 0 ..length) . map ( |_| de. read :: < T > ( ) ) . collect ( )
446+ }
447+ }
448+
449+ impl < K : Hash + Eq + Serializable , V : Serializable > Serializable for HashMap < K , V > {
450+ type Error = CryptoCoreError ;
451+
452+ fn length ( & self ) -> usize {
453+ self . len ( ) . length ( )
454+ + self
455+ . iter ( )
456+ . map ( |( k, v) | k. length ( ) + v. length ( ) )
457+ . sum :: < usize > ( )
458+ }
459+
460+ fn write ( & self , ser : & mut Serializer ) -> Result < usize , Self :: Error > {
461+ self . iter ( )
462+ . try_fold ( ser. write ( & self . len ( ) ) ?, |mut n, ( k, v) | {
463+ n += ser
464+ . write ( k)
465+ . map_err ( |e| CryptoCoreError :: GenericDeserializationError ( e. to_string ( ) ) ) ?;
466+ n += ser
467+ . write ( v)
468+ . map_err ( |e| CryptoCoreError :: GenericDeserializationError ( e. to_string ( ) ) ) ?;
469+ Ok ( n)
470+ } )
471+ }
472+
473+ fn read ( de : & mut Deserializer ) -> Result < Self , Self :: Error > {
474+ let length = de. read :: < usize > ( ) ?;
475+ ( 0 ..length)
476+ . map ( |_| {
477+ Ok ( (
478+ de. read :: < K > ( )
479+ . map_err ( |e| CryptoCoreError :: GenericDeserializationError ( e. to_string ( ) ) ) ?,
480+ de. read :: < V > ( )
481+ . map_err ( |e| CryptoCoreError :: GenericDeserializationError ( e. to_string ( ) ) ) ?,
482+ ) )
483+ } )
484+ . collect ( )
485+ }
486+ }
487+
276488struct ByteIterator < ' a > ( & ' a mut Deserializer < ' a > ) ;
277489
278490impl < ' a > ByteIterator < ' a > {
@@ -390,7 +602,9 @@ pub fn test_serialization<T: PartialEq + Debug + Serializable>(v: &T) -> Result<
390602
391603#[ cfg( test) ]
392604mod tests {
393- use super :: { to_leb128_len, Deserializer , Serializable , Serializer } ;
605+ use std:: collections:: { HashMap , HashSet } ;
606+
607+ use super :: { test_serialization, to_leb128_len, Deserializer , Serializable , Serializer } ;
394608 use crate :: {
395609 bytes_ser_de:: { pack, unpack} ,
396610 reexport:: rand_core:: { RngCore , SeedableRng } ,
@@ -408,7 +622,7 @@ mod tests {
408622 type Error = CryptoCoreError ;
409623
410624 fn length ( & self ) -> usize {
411- to_leb128_len ( self . bytes . len ( ) ) + self . bytes . len ( )
625+ self . bytes . len ( ) . length ( ) + self . bytes . len ( )
412626 }
413627
414628 fn write ( & self , ser : & mut crate :: bytes_ser_de:: Serializer ) -> Result < usize , Self :: Error > {
@@ -428,7 +642,7 @@ mod tests {
428642 let mut ser = Serializer :: new ( ) ;
429643 for i in 1 ..1000 {
430644 let n = rng. next_u32 ( ) ;
431- let length = ser. write_leb128_u64 ( u64 :: from ( n ) ) . unwrap ( ) ;
645+ let length = ser. write_leb128_u64 ( n as u64 ) . unwrap ( ) ;
432646 assert_eq ! (
433647 length,
434648 to_leb128_len( n as usize ) ,
@@ -512,4 +726,44 @@ mod tests {
512726 assert_eq ! ( booleans, res) ;
513727 }
514728 }
729+
730+ #[ test]
731+ fn test_base_serializations ( ) {
732+ let mut rng = CsRng :: from_entropy ( ) ;
733+
734+ let n = 0u64 ;
735+ test_serialization ( & n) . unwrap ( ) ;
736+
737+ #[ cfg( target_pointer_width = "64" ) ]
738+ {
739+ for i in 0 ..64 {
740+ let n: u64 = 1 << i;
741+ assert_eq ! ( n. length( ) , to_leb128_len( n as usize ) )
742+ }
743+ }
744+ #[ cfg( target_pointer_width = "32" ) ]
745+ {
746+ for i in 0 ..32 {
747+ let n: u64 = 1 << i;
748+ assert_eq ! ( n. length( ) , to_leb128_len( n as usize ) )
749+ }
750+ }
751+
752+ let string = format ! (
753+ "{:?}" ,
754+ ( 0 ..1000 ) . map( |_| rng. next_u64( ) ) . collect:: <Vec <_>>( )
755+ ) ;
756+ test_serialization ( & string) . unwrap ( ) ;
757+
758+ let v = ( 0 ..1000 ) . map ( |_| rng. next_u64 ( ) ) . collect :: < Vec < _ > > ( ) ;
759+ test_serialization ( & v) . unwrap ( ) ;
760+
761+ let s = ( 0 ..1000 ) . map ( |_| rng. next_u64 ( ) ) . collect :: < HashSet < _ > > ( ) ;
762+ test_serialization ( & s) . unwrap ( ) ;
763+
764+ let m = ( 0 ..1000 )
765+ . map ( |_| ( rng. next_u64 ( ) , rng. next_u64 ( ) ) )
766+ . collect :: < HashMap < _ , _ > > ( ) ;
767+ test_serialization ( & m) . unwrap ( ) ;
768+ }
515769}
0 commit comments