keri_core/event_message/
mod.rs

1pub mod cesr_adapter;
2pub mod dummy_event;
3pub mod event_msg_builder;
4pub mod key_event_message;
5pub mod msg;
6pub mod serializer;
7pub mod signature;
8pub mod signed_event_message;
9pub mod timestamped;
10
11use std::cmp::Ordering;
12
13use crate::event::KeyEvent;
14use chrono::{DateTime, Local};
15use serde::{Deserialize, Serialize};
16
17use self::msg::KeriEvent;
18
19pub trait Typeable {
20    type TypeTag;
21    fn get_type(&self) -> Self::TypeTag;
22}
23
24#[derive(
25    Clone,
26    Debug,
27    Serialize,
28    Deserialize,
29    PartialEq,
30    rkyv::Archive,
31    rkyv::Serialize,
32    rkyv::Deserialize,
33)]
34#[serde(rename_all = "lowercase")]
35pub enum EventTypeTag {
36    Icp,
37    Rot,
38    Ixn,
39    Dip,
40    Drt,
41    Rct,
42    Exn,
43    #[cfg(feature = "query")]
44    Rpy,
45    // #[cfg(feature = "query")]
46    Qry,
47}
48
49#[derive(Serialize, Deserialize, PartialEq)]
50pub struct TimestampedEventMessage {
51    pub timestamp: DateTime<Local>,
52    pub event_message: KeriEvent<KeyEvent>,
53}
54
55impl TimestampedEventMessage {
56    pub fn new(event: KeriEvent<KeyEvent>) -> Self {
57        Self {
58            timestamp: Local::now(),
59            event_message: event,
60        }
61    }
62}
63
64impl PartialOrd for TimestampedEventMessage {
65    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
66        Some(
67            match self.event_message.data.get_sn() == other.event_message.data.get_sn() {
68                true => Ordering::Equal,
69                false => {
70                    match self.event_message.data.get_sn() > other.event_message.data.get_sn() {
71                        true => Ordering::Greater,
72                        false => Ordering::Less,
73                    }
74                }
75            },
76        )
77    }
78}
79
80impl Ord for TimestampedEventMessage {
81    fn cmp(&self, other: &Self) -> Ordering {
82        match self.event_message.data.get_sn() == other.event_message.data.get_sn() {
83            true => Ordering::Equal,
84            false => match self.event_message.data.get_sn() > other.event_message.data.get_sn() {
85                true => Ordering::Greater,
86                false => Ordering::Less,
87            },
88        }
89    }
90}
91
92impl Eq for TimestampedEventMessage {}
93
94impl From<TimestampedEventMessage> for KeriEvent<KeyEvent> {
95    fn from(event: TimestampedEventMessage) -> KeriEvent<KeyEvent> {
96        event.event_message
97    }
98}
99
100/// WARNING: timestamp will change on conversion to current time
101impl From<KeriEvent<KeyEvent>> for TimestampedEventMessage {
102    fn from(event: KeriEvent<KeyEvent>) -> TimestampedEventMessage {
103        TimestampedEventMessage::new(event)
104    }
105}
106
107#[cfg(test)]
108mod tests {
109    mod test_utils;
110
111    use self::test_utils::test_mock_event_sequence;
112    use super::{event_msg_builder::EventMsgBuilder, *};
113    use crate::{
114        error::Error,
115        event::{
116            event_data::{inception::InceptionEvent, EventData},
117            sections::{
118                key_config::nxt_commitment, threshold::SignatureThreshold, InceptionWitnessConfig,
119                KeyConfig,
120            },
121            KeyEvent,
122        },
123        keys::{PrivateKey, PublicKey},
124        prefix::{BasicPrefix, IdentifierPrefix, IndexedSignature, SelfSigningPrefix},
125        signer::setup_signers,
126        state::{EventSemantics, IdentifierState},
127    };
128    use cesrox::primitives::CesrPrimitive;
129    use ed25519_dalek::Keypair;
130    use rand::rngs::OsRng;
131    use said::derivation::HashFunctionCode;
132    use said::version::format::SerializationFormats;
133
134    #[test]
135    fn basic_create() -> Result<(), Error> {
136        // hi Ed!
137        let kp0 = Keypair::generate(&mut OsRng);
138        let kp1 = Keypair::generate(&mut OsRng);
139
140        // get two ed25519 keypairs
141        let pub_key0 = PublicKey::new(kp0.public.to_bytes().to_vec());
142        let priv_key0 = PrivateKey::new(kp0.secret.to_bytes().to_vec());
143        let (pub_key1, _priv_key1) = (
144            PublicKey::new(kp1.public.to_bytes().to_vec()),
145            PrivateKey::new(kp1.secret.to_bytes().to_vec()),
146        );
147
148        // initial signing key prefix
149        let pref0 = BasicPrefix::Ed25519(pub_key0);
150
151        // initial control key hash prefix
152        let pref1 = BasicPrefix::Ed25519(pub_key1);
153        let nxt = nxt_commitment(
154            SignatureThreshold::Simple(1),
155            &vec![pref1],
156            &HashFunctionCode::Blake3_256.into(),
157        );
158
159        // create a simple inception event
160        let icp = KeyEvent::new(
161            IdentifierPrefix::Basic(pref0.clone()),
162            0,
163            EventData::Icp(InceptionEvent {
164                key_config: KeyConfig::new(
165                    vec![pref0.clone()],
166                    nxt.clone(),
167                    Some(SignatureThreshold::Simple(1)),
168                ),
169                witness_config: InceptionWitnessConfig::default(),
170                inception_configuration: vec![],
171                data: vec![],
172            }),
173        );
174
175        let icp_m = icp.to_message(
176            SerializationFormats::JSON,
177            HashFunctionCode::Blake3_256.into(),
178        )?;
179
180        // serialised message
181        let ser: Vec<_> = icp_m.encode()?;
182
183        // sign
184        let sig = priv_key0.sign_ed(&ser)?;
185        let attached_sig =
186            IndexedSignature::new_both_same(SelfSigningPrefix::Ed25519Sha512(sig), 0);
187
188        assert!(pref0.verify(&ser, &attached_sig.signature)?);
189
190        let signed_event = icp_m.sign(vec![attached_sig], None, None);
191
192        let s_ = IdentifierState::default();
193
194        let s0 = s_.apply(&signed_event)?;
195
196        assert!(s0.current.verify(&ser, &signed_event.signatures)?);
197
198        assert_eq!(s0.prefix, IdentifierPrefix::Basic(pref0.clone()));
199        assert_eq!(s0.sn, 0);
200        assert!(icp_m.compare_digest(&s0.last_event_digest)?);
201        assert_eq!(s0.current.public_keys.len(), 1);
202        assert_eq!(s0.current.public_keys[0], pref0);
203        assert_eq!(s0.current.threshold, SignatureThreshold::Simple(1));
204        assert_eq!(s0.current.next_keys_data, nxt);
205        assert!(s0.witness_config.witnesses.is_empty());
206        assert_eq!(s0.witness_config.tally, SignatureThreshold::Simple(0));
207
208        Ok(())
209    }
210
211    #[test]
212    fn self_addressing_create() -> Result<(), Error> {
213        // hi Ed!
214        let kp0 = Keypair::generate(&mut OsRng);
215        let kp1 = Keypair::generate(&mut OsRng);
216        let kp2 = Keypair::generate(&mut OsRng);
217
218        // get two ed25519 keypairs
219        let pub_key0 = PublicKey::new(kp0.public.to_bytes().to_vec());
220        let priv_key0 = PrivateKey::new(kp0.secret.to_bytes().to_vec());
221        let (pub_key1, sig_key_1) = (
222            PublicKey::new(kp1.public.to_bytes().to_vec()),
223            PrivateKey::new(kp1.secret.to_bytes().to_vec()),
224        );
225
226        // hi X!
227        // let x = XChaCha20Poly1305::new((&priv_key0.into_bytes()[..]).into());
228
229        // get two X25519 keypairs
230        let (enc_key_0, _enc_priv_0) = (PublicKey::new(kp2.public.to_bytes().to_vec()), sig_key_1);
231        let (enc_key_1, _enc_priv_1) = (
232            PublicKey::new(kp2.public.to_bytes().to_vec()),
233            PrivateKey::new(kp2.secret.to_bytes().to_vec()),
234        );
235
236        // initial key set
237        let sig_pref_0 = BasicPrefix::Ed25519(pub_key0);
238        let enc_pref_0 = BasicPrefix::X25519(enc_key_0);
239
240        // next key set
241        let sig_pref_1 = BasicPrefix::Ed25519(pub_key1);
242        let enc_pref_1 = BasicPrefix::X25519(enc_key_1);
243
244        // next key set pre-commitment
245        let nexter_pref = nxt_commitment(
246            SignatureThreshold::default(),
247            &[sig_pref_1, enc_pref_1],
248            &HashFunctionCode::Blake3_256.into(),
249        );
250
251        let icp = InceptionEvent::new(
252            KeyConfig::new(
253                vec![sig_pref_0.clone(), enc_pref_0.clone()],
254                nexter_pref.clone(),
255                Some(SignatureThreshold::default()),
256            ),
257            None,
258            None,
259        )
260        .incept_self_addressing(
261            HashFunctionCode::Blake3_256.into(),
262            SerializationFormats::JSON,
263        )?;
264
265        // serialised
266        let serialized: Vec<_> = icp.encode()?;
267
268        // sign
269        let sk = priv_key0;
270        let sig = sk.sign_ed(&serialized)?;
271        let attached_sig =
272            IndexedSignature::new_both_same(SelfSigningPrefix::Ed25519Sha512(sig), 0);
273
274        assert!(sig_pref_0.verify(&serialized, &attached_sig.signature)?);
275
276        let signed_event = icp.sign(vec![attached_sig], None, None);
277
278        let s_ = IdentifierState::default();
279
280        let s0 = s_.apply(&signed_event)?;
281
282        assert!(s0.current.verify(&serialized, &signed_event.signatures)?);
283
284        assert_eq!(s0.prefix, icp.data.get_prefix());
285        assert_eq!(s0.sn, 0);
286        assert!(icp.compare_digest(&s0.last_event_digest)?);
287        assert_eq!(s0.current.public_keys.len(), 2);
288        assert_eq!(s0.current.public_keys[0], sig_pref_0);
289        assert_eq!(s0.current.public_keys[1], enc_pref_0);
290        assert_eq!(s0.current.threshold, SignatureThreshold::default());
291        assert_eq!(s0.current.next_keys_data, nexter_pref);
292        assert!(s0.witness_config.witnesses.is_empty());
293        assert_eq!(s0.witness_config.tally, SignatureThreshold::Simple(0));
294
295        Ok(())
296    }
297
298    #[test]
299    fn test_basic_establishment_sequence() -> Result<(), Error> {
300        // Sequence should contain Inception Event.
301        let no_inception_seq = vec![EventTypeTag::Rot, EventTypeTag::Rot];
302        assert!(test_mock_event_sequence(no_inception_seq).is_err());
303
304        // Sequence can't start with Rotation Event.
305        let rotation_first_seq = vec![EventTypeTag::Rot, EventTypeTag::Icp];
306        assert!(test_mock_event_sequence(rotation_first_seq).is_err());
307
308        // Sequence should contain exacly one Inception Event.
309        let wrong_seq = vec![
310            EventTypeTag::Icp,
311            EventTypeTag::Rot,
312            EventTypeTag::Rot,
313            EventTypeTag::Icp,
314        ];
315        assert!(test_mock_event_sequence(wrong_seq).is_err());
316
317        let ok_seq = vec![EventTypeTag::Icp, EventTypeTag::Rot, EventTypeTag::Rot];
318        assert!(test_mock_event_sequence(ok_seq).is_ok());
319
320        // Wrong delegated events sequence.
321        let wrong_delegated_sequence =
322            vec![EventTypeTag::Dip, EventTypeTag::Drt, EventTypeTag::Rot];
323        assert!(test_mock_event_sequence(wrong_delegated_sequence).is_err());
324
325        // Delegated events sequence.
326        let delegated_sequence = vec![EventTypeTag::Dip, EventTypeTag::Drt, EventTypeTag::Ixn];
327        assert!(test_mock_event_sequence(delegated_sequence).is_ok());
328
329        Ok(())
330    }
331
332    #[test]
333    fn test_basic_sequence() -> Result<(), Error> {
334        let ok_seq = vec![
335            EventTypeTag::Icp,
336            EventTypeTag::Ixn,
337            EventTypeTag::Ixn,
338            EventTypeTag::Ixn,
339            EventTypeTag::Rot,
340            EventTypeTag::Ixn,
341        ];
342        assert!(test_mock_event_sequence(ok_seq).is_ok());
343
344        let delegated_sequence = vec![
345            EventTypeTag::Dip,
346            EventTypeTag::Drt,
347            EventTypeTag::Ixn,
348            EventTypeTag::Drt,
349        ];
350        assert!(test_mock_event_sequence(delegated_sequence).is_ok());
351
352        Ok(())
353    }
354
355    #[test]
356    pub fn test_partial_rotation() -> Result<(), Error> {
357        // setup keypairs
358        let signers = setup_signers();
359
360        let keys = vec![BasicPrefix::Ed25519(signers[0].public_key())];
361
362        let next_pks = signers[1..6]
363            .iter()
364            .map(|signer| BasicPrefix::Ed25519(signer.public_key()))
365            .collect::<Vec<_>>();
366        // build inception event
367        let icp = EventMsgBuilder::new(EventTypeTag::Icp)
368            .with_keys(keys)
369            .with_threshold(&SignatureThreshold::Simple(1))
370            .with_next_keys(next_pks)
371            .with_next_threshold(&SignatureThreshold::single_weighted(vec![
372                (1, 2),
373                (1, 2),
374                (1, 3),
375                (1, 3),
376                (1, 3),
377            ]))
378            .build()
379            .unwrap();
380
381        let id_prefix = icp.data.get_prefix();
382        let icp_digest = icp.digest()?;
383        assert_eq!(
384            id_prefix,
385            IdentifierPrefix::self_addressing(icp_digest.clone())
386        );
387        assert_eq!(
388            id_prefix.to_str(),
389            "EM2y0cPBcua33FMaji79hQ2NVq7mzIIEX8Zlw0Ch5OQQ"
390        );
391
392        let state = IdentifierState::default();
393        let state = icp.apply_to(state)?;
394
395        // create partial rotation event. Subset of keys set in inception event as
396        // next keys
397        let current_signers = [&signers[3], &signers[4], &signers[5]];
398        let current_public_keys = current_signers
399            .iter()
400            .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
401            .collect::<Vec<_>>();
402        let next_public_keys = signers[11..16]
403            .iter()
404            .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
405            .collect::<Vec<_>>();
406
407        // Generate partial rotation event
408        let rotation = EventMsgBuilder::new(EventTypeTag::Rot)
409            .with_prefix(&id_prefix)
410            .with_previous_event(&icp_digest)
411            .with_keys(current_public_keys.clone())
412            .with_threshold(&SignatureThreshold::single_weighted(vec![
413                (1, 2),
414                (1, 2),
415                (1, 3),
416            ]))
417            .with_next_keys(next_public_keys)
418            .with_next_threshold(&SignatureThreshold::single_weighted(vec![
419                (1, 2),
420                (1, 2),
421                (1, 3),
422                (1, 3),
423                (1, 3),
424            ]))
425            .build()?;
426
427        let rot_digest = rotation.digest()?;
428        let state = rotation.apply_to(state)?;
429
430        assert_eq!(state.sn, 1);
431        assert_eq!(&state.current.public_keys, &current_public_keys);
432        assert_eq!(
433            serde_json::to_string(&state.current.threshold).unwrap(),
434            "[\"1/2\",\"1/2\",\"1/3\"]"
435        );
436
437        let current_signers = [&signers[13], &signers[14]];
438        let next_public_keys = vec![];
439        let current_public_keys = current_signers
440            .iter()
441            .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
442            .collect::<Vec<_>>();
443
444        //  Partial rotation that will fail because it does not have enough
445        //  public keys to satisfy prior threshold (`nt`).
446        let rotation = EventMsgBuilder::new(EventTypeTag::Rot)
447            .with_prefix(&id_prefix)
448            .with_keys(current_public_keys)
449            .with_threshold(&SignatureThreshold::Simple(2))
450            .with_next_keys(next_public_keys)
451            .with_next_threshold(&SignatureThreshold::Simple(0))
452            .with_sn(2)
453            .with_previous_event(&rot_digest)
454            .build()?;
455
456        let res = rotation.apply_to(state);
457        assert!(matches!(res.unwrap_err(), Error::NotEnoughSigsError));
458
459        Ok(())
460    }
461}