1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use ;
use ;
use ToHex;
/// Signed Fact — fato assinado imutável (Paper II).
///
/// Representa um valor canônico com CID (BLAKE3) e assinatura Ed25519.
/// Um `SignedFact` é imutável e verificável por qualquer pessoa que tenha acesso
/// ao fato, sem necessidade de confiar em terceiros.
///
/// # Estrutura
///
/// - `canonical`: bytes canônicos JSON✯Atomic do valor original
/// - `cid`: BLAKE3 hash dos bytes canônicos (32 bytes)
/// - `signature`: assinatura Ed25519 sobre o CID (64 bytes)
/// - `public_key`: chave pública Ed25519 (32 bytes)
/// - `hash_alg`: algoritmo de hash ("blake3")
/// - `sig_alg`: algoritmo de assinatura ("ed25519")
/// - `canon_ver`: versão do formato canônico ("1")
/// - `format_id`: identificador do formato ("json-atomic/1")
///
/// # Exemplo
///
/// ```rust
/// use ed25519_dalek::SigningKey;
/// use json_atomic::{seal_value, verify_seal, errors::SealError};
/// use serde::Serialize;
///
/// #[derive(Serialize)]
/// struct Data { value: u64 }
///
/// // Chave de exemplo (em produção, derive de seed/keystore)
/// let sk = SigningKey::from_bytes(&[0u8; 32]);
/// let signed = seal_value(&Data { value: 42 }, &sk)?;
///
/// // Verifica integridade e autenticidade
/// verify_seal(&signed)?;
///
/// // Acessa o CID em hexadecimal
/// println!("CID: {}", signed.cid_hex());
/// # Ok::<(), SealError>(())
/// ```