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::SigningKey;
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 = SigningKey::generate(&mut OsRng);
138        let kp1 = SigningKey::generate(&mut OsRng);
139
140        // get two ed25519 keypairs
141        let pub_key0 = PublicKey::new(kp0.verifying_key().to_bytes().to_vec());
142        let priv_key0 = PrivateKey::new(kp0.to_bytes().to_vec());
143        let (pub_key1, _priv_key1) = (
144            PublicKey::new(kp1.verifying_key().to_bytes().to_vec()),
145            PrivateKey::new(kp1.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.into())?);
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 = SigningKey::generate(&mut OsRng);
215        let kp1 = SigningKey::generate(&mut OsRng);
216        let kp2 = SigningKey::generate(&mut OsRng);
217
218        // get two ed25519 keypairs
219        let pub_key0 = PublicKey::new(kp0.verifying_key().to_bytes().to_vec());
220        let priv_key0 = PrivateKey::new(kp0.to_bytes().to_vec());
221        let (pub_key1, sig_key_1) = (
222            PublicKey::new(kp1.verifying_key().to_bytes().to_vec()),
223            PrivateKey::new(kp1.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) = (
231            PublicKey::new(kp2.verifying_key().to_bytes().to_vec()),
232            sig_key_1,
233        );
234        let (enc_key_1, _enc_priv_1) = (
235            PublicKey::new(kp2.verifying_key().to_bytes().to_vec()),
236            PrivateKey::new(kp2.to_bytes().to_vec()),
237        );
238
239        // initial key set
240        let sig_pref_0 = BasicPrefix::Ed25519(pub_key0);
241        let enc_pref_0 = BasicPrefix::X25519(enc_key_0);
242
243        // next key set
244        let sig_pref_1 = BasicPrefix::Ed25519(pub_key1);
245        let enc_pref_1 = BasicPrefix::X25519(enc_key_1);
246
247        // next key set pre-commitment
248        let nexter_pref = nxt_commitment(
249            SignatureThreshold::default(),
250            &[sig_pref_1, enc_pref_1],
251            &HashFunctionCode::Blake3_256.into(),
252        );
253
254        let icp = InceptionEvent::new(
255            KeyConfig::new(
256                vec![sig_pref_0.clone(), enc_pref_0.clone()],
257                nexter_pref.clone(),
258                Some(SignatureThreshold::default()),
259            ),
260            None,
261            None,
262        )
263        .incept_self_addressing(
264            HashFunctionCode::Blake3_256.into(),
265            SerializationFormats::JSON,
266        )?;
267
268        // serialised
269        let serialized: Vec<_> = icp.encode()?;
270
271        // sign
272        let sk = priv_key0;
273        let sig = sk.sign_ed(&serialized)?;
274        let attached_sig =
275            IndexedSignature::new_both_same(SelfSigningPrefix::Ed25519Sha512(sig), 0);
276
277        assert!(sig_pref_0.verify(&serialized, &attached_sig.signature)?);
278
279        let signed_event = icp.sign(vec![attached_sig], None, None);
280
281        let s_ = IdentifierState::default();
282
283        let s0 = s_.apply(&signed_event)?;
284
285        assert!(s0.current.verify(&serialized, &signed_event.signatures)?);
286
287        assert_eq!(s0.prefix, icp.data.get_prefix());
288        assert_eq!(s0.sn, 0);
289        assert!(icp.compare_digest(&s0.last_event_digest.into())?);
290        assert_eq!(s0.current.public_keys.len(), 2);
291        assert_eq!(s0.current.public_keys[0], sig_pref_0);
292        assert_eq!(s0.current.public_keys[1], enc_pref_0);
293        assert_eq!(s0.current.threshold, SignatureThreshold::default());
294        assert_eq!(s0.current.next_keys_data, nexter_pref);
295        assert!(s0.witness_config.witnesses.is_empty());
296        assert_eq!(s0.witness_config.tally, SignatureThreshold::Simple(0));
297
298        Ok(())
299    }
300
301    #[test]
302    fn test_basic_establishment_sequence() -> Result<(), Error> {
303        // Sequence should contain Inception Event.
304        let no_inception_seq = vec![EventTypeTag::Rot, EventTypeTag::Rot];
305        assert!(test_mock_event_sequence(no_inception_seq).is_err());
306
307        // Sequence can't start with Rotation Event.
308        let rotation_first_seq = vec![EventTypeTag::Rot, EventTypeTag::Icp];
309        assert!(test_mock_event_sequence(rotation_first_seq).is_err());
310
311        // Sequence should contain exacly one Inception Event.
312        let wrong_seq = vec![
313            EventTypeTag::Icp,
314            EventTypeTag::Rot,
315            EventTypeTag::Rot,
316            EventTypeTag::Icp,
317        ];
318        assert!(test_mock_event_sequence(wrong_seq).is_err());
319
320        let ok_seq = vec![EventTypeTag::Icp, EventTypeTag::Rot, EventTypeTag::Rot];
321        assert!(test_mock_event_sequence(ok_seq).is_ok());
322
323        // Wrong delegated events sequence.
324        let wrong_delegated_sequence =
325            vec![EventTypeTag::Dip, EventTypeTag::Drt, EventTypeTag::Rot];
326        assert!(test_mock_event_sequence(wrong_delegated_sequence).is_err());
327
328        // Delegated events sequence.
329        let delegated_sequence = vec![EventTypeTag::Dip, EventTypeTag::Drt, EventTypeTag::Ixn];
330        assert!(test_mock_event_sequence(delegated_sequence).is_ok());
331
332        Ok(())
333    }
334
335    #[test]
336    fn test_basic_sequence() -> Result<(), Error> {
337        let ok_seq = vec![
338            EventTypeTag::Icp,
339            EventTypeTag::Ixn,
340            EventTypeTag::Ixn,
341            EventTypeTag::Ixn,
342            EventTypeTag::Rot,
343            EventTypeTag::Ixn,
344        ];
345        assert!(test_mock_event_sequence(ok_seq).is_ok());
346
347        let delegated_sequence = vec![
348            EventTypeTag::Dip,
349            EventTypeTag::Drt,
350            EventTypeTag::Ixn,
351            EventTypeTag::Drt,
352        ];
353        assert!(test_mock_event_sequence(delegated_sequence).is_ok());
354
355        Ok(())
356    }
357
358    #[test]
359    pub fn test_partial_rotation() -> Result<(), Error> {
360        // setup keypairs
361        let signers = setup_signers();
362
363        let keys = vec![BasicPrefix::Ed25519(signers[0].public_key())];
364
365        let next_pks = signers[1..6]
366            .iter()
367            .map(|signer| BasicPrefix::Ed25519(signer.public_key()))
368            .collect::<Vec<_>>();
369        // build inception event
370        let icp = EventMsgBuilder::new(EventTypeTag::Icp)
371            .with_keys(keys)
372            .with_threshold(&SignatureThreshold::Simple(1))
373            .with_next_keys(next_pks)
374            .with_next_threshold(&SignatureThreshold::single_weighted(vec![
375                (1, 2),
376                (1, 2),
377                (1, 3),
378                (1, 3),
379                (1, 3),
380            ]))
381            .build()
382            .unwrap();
383
384        let id_prefix = icp.data.get_prefix();
385        let icp_digest = icp.digest()?;
386        assert_eq!(
387            id_prefix,
388            IdentifierPrefix::self_addressing(icp_digest.clone())
389        );
390        assert_eq!(
391            id_prefix.to_str(),
392            "EM2y0cPBcua33FMaji79hQ2NVq7mzIIEX8Zlw0Ch5OQQ"
393        );
394
395        let state = IdentifierState::default();
396        let state = icp.apply_to(state)?;
397
398        // create partial rotation event. Subset of keys set in inception event as
399        // next keys
400        let current_signers = [&signers[3], &signers[4], &signers[5]];
401        let current_public_keys = current_signers
402            .iter()
403            .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
404            .collect::<Vec<_>>();
405        let next_public_keys = signers[11..16]
406            .iter()
407            .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
408            .collect::<Vec<_>>();
409
410        // Generate partial rotation event
411        let rotation = EventMsgBuilder::new(EventTypeTag::Rot)
412            .with_prefix(&id_prefix)
413            .with_previous_event(&icp_digest)
414            .with_keys(current_public_keys.clone())
415            .with_threshold(&SignatureThreshold::single_weighted(vec![
416                (1, 2),
417                (1, 2),
418                (1, 3),
419            ]))
420            .with_next_keys(next_public_keys)
421            .with_next_threshold(&SignatureThreshold::single_weighted(vec![
422                (1, 2),
423                (1, 2),
424                (1, 3),
425                (1, 3),
426                (1, 3),
427            ]))
428            .build()?;
429
430        let rot_digest = rotation.digest()?;
431        let state = rotation.apply_to(state)?;
432
433        assert_eq!(state.sn, 1);
434        assert_eq!(&state.current.public_keys, &current_public_keys);
435        assert_eq!(
436            serde_json::to_string(&state.current.threshold).unwrap(),
437            "[\"1/2\",\"1/2\",\"1/3\"]"
438        );
439
440        let current_signers = [&signers[13], &signers[14]];
441        let next_public_keys = vec![];
442        let current_public_keys = current_signers
443            .iter()
444            .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
445            .collect::<Vec<_>>();
446
447        //  Partial rotation that will fail because it does not have enough
448        //  public keys to satisfy prior threshold (`nt`).
449        let rotation = EventMsgBuilder::new(EventTypeTag::Rot)
450            .with_prefix(&id_prefix)
451            .with_keys(current_public_keys)
452            .with_threshold(&SignatureThreshold::Simple(2))
453            .with_next_keys(next_public_keys)
454            .with_next_threshold(&SignatureThreshold::Simple(0))
455            .with_sn(2)
456            .with_previous_event(&rot_digest)
457            .build()?;
458
459        let res = rotation.apply_to(state);
460        assert!(matches!(res.unwrap_err(), Error::NotEnoughSigsError));
461
462        Ok(())
463    }
464}