1 unstable release
0.1.0 | Nov 24, 2023 |
---|
#1713 in Cryptography
1,320 downloads per month
Used in 5 crates
36KB
428 lines
Unambiguously digest structured data
udigest
provides utilities for unambiguous hashing the structured data. Structured
data can be anything that implements Digestable
trait:
str
,String
,CStr
,CString
- Integers:
i8
,i16
,i32
,i64
,i128
,u8
,u16
,u32
,u64
,u128
,char
- Containers:
Box
,Arc
,Rc
,Cow
,Option
,Result
- Collections: arrays, slices,
Vec
,LinkedList
,VecDeque
,BTreeSet
,BTreeMap
The trait is intentionally not implemented for certain types:
HashMap
,HashSet
as they can not be traversed in determenistic orderusize
,isize
as their byte size varies on differnet platforms
The Digestable
trait can be implemented for the struct using a macro:
use udigest::{Tag, udigest};
use sha2::Sha256;
#[derive(udigest::Digestable)]
struct Person {
name: String,
job_title: String,
}
let alice = &Person {
name: "Alice".into(),
job_title: "cryptographer".into(),
};
let tag = Tag::<Sha256>::new("udigest.example");
let hash = udigest(tag, &alice);
The crate intentionally does not try to follow any existing standards for unambiguous
encoding. The format for encoding was desingned specifically for udigest
to provide
a better usage experience in Rust. The details of encoding format can be found in
encoding
module.
Features
std
implementsDigestable
trait for types in standard libraryalloc
implementsDigestable
trait for type inalloc
cratederive
enablesDigestable
proc macro
Dependencies
~265–445KB
~11K SLoC