holographic_memory/core/provenance/
trust.rs1use std::collections::HashSet;
14
15use anyhow::Result;
16use ed25519_dalek::VerifyingKey;
17
18use super::did;
19
20#[derive(Default, Clone)]
26pub struct TrustStore {
27 keys: HashSet<[u8; 32]>,
28}
29
30impl TrustStore {
31 pub fn new() -> Self {
34 Self::default()
35 }
36
37 pub fn trust_key(&mut self, key: &VerifyingKey) -> &mut Self {
39 self.keys.insert(key.to_bytes());
40 self
41 }
42
43 pub fn trust_did(&mut self, did_key: &str) -> Result<&mut Self> {
46 let pk = did::ed25519_from_did_key(did_key)?;
47 self.keys.insert(pk);
48 Ok(self)
49 }
50
51 pub fn trust_did_jwk(&mut self, did_jwk: &str) -> Result<&mut Self> {
54 let pk = did::ed25519_from_did_jwk(did_jwk)?;
55 self.keys.insert(pk);
56 Ok(self)
57 }
58
59 pub fn trusting_key(key: &VerifyingKey) -> Self {
61 let mut s = Self::new();
62 s.trust_key(key);
63 s
64 }
65
66 pub fn trusting_did(did_key: &str) -> Result<Self> {
68 let mut s = Self::new();
69 s.trust_did(did_key)?;
70 Ok(s)
71 }
72
73 pub fn is_trusted(&self, key: &VerifyingKey) -> bool {
75 self.keys.contains(&key.to_bytes())
76 }
77
78 pub fn is_empty(&self) -> bool {
80 self.keys.is_empty()
81 }
82
83 pub fn len(&self) -> usize {
85 self.keys.len()
86 }
87}
88
89#[cfg(test)]
90mod tests {
91 use super::*;
92 use ed25519_dalek::SigningKey;
93
94 fn key() -> SigningKey {
95 SigningKey::from_bytes(&rand::random())
96 }
97
98 #[test]
99 fn empty_trusts_nothing() {
100 let store = TrustStore::new();
101 assert!(store.is_empty());
102 assert!(!store.is_trusted(&key().verifying_key()));
103 }
104
105 #[test]
106 fn trusts_added_key_only() {
107 let trusted = key();
108 let other = key();
109 let store = TrustStore::trusting_key(&trusted.verifying_key());
110 assert!(store.is_trusted(&trusted.verifying_key()));
111 assert!(!store.is_trusted(&other.verifying_key()));
112 assert_eq!(store.len(), 1);
113 }
114
115 #[test]
116 fn trust_via_did_roundtrips() {
117 let k = key();
118 let did = did::did_key_from_ed25519(&k.verifying_key().to_bytes());
119 let store = TrustStore::trusting_did(&did).unwrap();
120 assert!(store.is_trusted(&k.verifying_key()));
121 }
122}