diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 7 | ||||
| -rw-r--r-- | src/test.rs | 28 |
2 files changed, 32 insertions, 3 deletions
@@ -219,7 +219,12 @@ fn counter_high(counter: u64) -> u32 { #[cfg_attr(feature = "zeroize", derive(zeroize::Zeroize))] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[derive(Clone, Copy, Hash)] -pub struct Hash([u8; OUT_LEN]); +pub struct Hash( + #[rustfmt::skip] + // In formats like CBOR, bytestrings are more compact than lists of ints. + #[cfg_attr(feature = "serde", serde(with = "serde_bytes"))] + [u8; OUT_LEN], +); impl Hash { /// The raw bytes of the `Hash`. Note that byte arrays don't provide diff --git a/src/test.rs b/src/test.rs index c76cbbc..b5bd4dc 100644 --- a/src/test.rs +++ b/src/test.rs @@ -809,14 +809,38 @@ fn test_mmap_rayon() -> Result<(), std::io::Error> { #[cfg(feature = "std")] #[cfg(feature = "serde")] fn test_serde() { - let hash: crate::Hash = [7; 32].into(); + let hash: crate::Hash = [255; 32].into(); + let json = serde_json::to_string(&hash).unwrap(); assert_eq!( json, - "[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]", + "[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]", ); let hash2: crate::Hash = serde_json::from_str(&json).unwrap(); assert_eq!(hash, hash2); + + let mut cbor = Vec::<u8>::new(); + ciborium::into_writer(&hash, &mut cbor).unwrap(); + assert_eq!( + cbor, + [ + 88, 32, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + ] + ); + let hash_from_cbor: crate::Hash = ciborium::from_reader(&cbor[..]).unwrap(); + assert_eq!(hash_from_cbor, hash); + + // Before we used serde_bytes, the hash [255; 32] would serialize as an array instead of a + // byte string, like this. Make sure we can still deserialize this representation. + let old_cbor: &[u8] = &[ + 152, 32, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, + 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, + 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, 24, 255, + 24, 255, 24, 255, 24, 255, + ]; + let hash_from_old_cbor: crate::Hash = ciborium::from_reader(old_cbor).unwrap(); + assert_eq!(hash_from_old_cbor, hash); } // `cargo +nightly miri test` currently works, but it takes forever, because some of our test |
