Skip to main content

json_digest/
lib.rs

1#![warn(missing_docs)]
2#![cfg_attr(not(feature = "std"), no_std)]
3
4//! This library provides some algorithms to calculate cryptographically secure digests of JSON documents.
5//! Since JSON is an ambiguous serialization format, we also had to define a canonical deterministic subset
6//! of all allowed documents. Order of keys in an object and Unicode normalization are well-defined in this
7//! subset, making it suitable for hashing.
8//!
9//! ```
10//! let data = serde_json::json!({
11//!   "address": {
12//!     "value": "6 Unter den Linden, Berlin, Germany",
13//!     "nonce": "uN_FTaYe8JM-EZ8SU94kAOf0k0YvnhLcZgdpQ3BU9Ymbu"
14//!   },
15//!   "dateOfBirth": {
16//!     "value": "16/02/2002",
17//!     "nonce": "ufxkENKgXuf4yG50p6xpSyaQ8Gz7KsuqXid2yw533TUMK"
18//!   },
19//!   "placeOfBirth": {
20//!     "city": "Berlin",
21//!     "country": "Germany",
22//!     "nonce": "ukhFsI4a6vIZEDUOBRxJmLroPEQ8FQCjJwbI-Z7bEocGo"
23//!   },
24//! });
25//!
26//! let digest = json_digest::digest_data(&data).unwrap();
27//! assert_eq!(digest, "cjuQR3pDJeaiRv9oCZ-fBE7T8QWpUGfjP40sAXq0bLwr-8");
28//!
29//! let partial_digest = json_digest::selective_digest_data(&data, ".dateOfBirth").unwrap();
30//! let expected_partial_digest = serde_json::json!({
31//!   "address": "cjuvIf1PmPH_31JN5XqJ1xkcNDJyiw9zQ-7ansSB78gnt4",
32//!   "dateOfBirth": {
33//!     "nonce": "ufxkENKgXuf4yG50p6xpSyaQ8Gz7KsuqXid2yw533TUMK",
34//!     "value":"16/02/2002"
35//!   },
36//!   "placeOfBirth": "cjub0Nxb0Kz0pI4bWCdSbaCutk1s5qieFT-ZmqUU1xcuAc"
37//! });
38//! assert_eq!(partial_digest, serde_json::to_string(&expected_partial_digest).unwrap());
39//!
40//! let digest_from_partial = json_digest::digest_json_str(&partial_digest).unwrap();
41//! assert_eq!(digest, digest_from_partial);
42//! ```
43
44extern crate alloc;
45
46mod digest;
47pub mod error;
48mod hasher;
49pub mod json_path;
50mod nonce;
51
52pub use digest::*;
53pub use error::*;
54pub use hasher::*;
55pub use nonce::*;